精华内容
下载资源
问答
  • 大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法线程就立刻停止了吗?...

     

    大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法后线程就立刻停止了吗? 答案是:不是!

    下面我们来解释一下Abort方法是如何工作的。因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abort方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管的代码而且还没有返回的话,该线程就不会立即终止。而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。不过这种情况只是一些特例,更多的情况是目标线程在调用托管的代码,一旦Abort被调用那么该线程就立即终止了。

    其实一个线程在运行时,我们可以通过Thread.ThreadState属性读出它的状态,正在运行的线程状态就是ThreadState.Running。然后如果我们想强制停止正在执行的线程,就会调用Thread.Abort方法,但是Thread.Abort方法做的事情只是在线程上抛出了一个ThreadAbortException异常,然后将线程的状态置为ThreadState.AbortRequested,MSDN对AbortRequested状态的解释是:已对线程调用了 Thread.Abort 方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException,也就是说线程在ThreadState.AbortRequested状态时表示即将结束但是还没有真正结束。可是Thread.Abort方法将线程的状态置为ThreadState.AbortRequested后就立马返回了,而线程真正结束后的状态应该是ThreadState.Aborted,所以一定要注意在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值或者调用Thread.Join方法来确保被终止线程已经真正停止,只有当Thread.ThreadState属性为Aborted或Thread.Join方法返回时,才表示线程真正结束了。

    下面我就写一个示例代码来说明在调用Thread.Abort方法后,怎样保证线程停止后代码才会继续执行

     

    复制代码

    var thread = new Thread(
        new ThreadStart(
            () =>
                {
                    while (true)
                    {
                        //该线程会进行无限循环,自己不会结束
                        Thread.Sleep(100);
                    }
                }));
    
    thread.IsBackground = true;
    thread.Start();//启动线程
    
    thread.Abort();//调用Thread.Abort方法试图强制终止thread线程
    
    //上面调用Thread.Abort方法后线程thread不一定马上就被终止了,所以我们在这里写了个循环来做检查,看线程thread是否已经真正停止。其实也可以在这里使用Thread.Join方法来等待线程thread终止,Thread.Join方法做的事情和我们在这里写的循环效果是一样的,都是阻塞主线程直到thread线程终止为止
    while (thread.ThreadState!=ThreadState.Aborted)
    {
        //当调用Abort方法后,如果thread线程的状态不为Aborted,主线程就一直在这里做循环,直到thread线程的状态变为Aborted为止
        Thread.Sleep(100);
    }
    
    //当跳出上面的循环后就表示我们启动的线程thread已经完全终止了
    展开全文
  • 大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法线程就立刻停止了吗?...

    大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法后线程就立刻停止了吗? 答案是:不是!

     

    下面我们来解释一下Abort方法是如何工作的。因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abort方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管的代码而且还没有返回的话,该线程就不会立即终止而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。不过这种情况只是一些特例,更多的情况是目标线程在调用托管的代码,一旦Abort被调用那么该线程就立即终止了。

     

    其实一个线程在运行时,我们可以通过Thread.ThreadState属性读出它的状态,正在运行的线程状态就是ThreadState.Running。然后如果我们想强制停止正在执行的线程,就会调用Thread.Abort方法,但是Thread.Abort方法做的事情只是在线程上抛出了一个ThreadAbortException异常,然后将线程的状态置为ThreadState.AbortRequested,MSDN对AbortRequested状态的解释是:已对线程调用了 Thread.Abort 方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException,也就是说线程在ThreadState.AbortRequested状态时表示即将结束但是还没有真正结束。可是Thread.Abort方法将线程的状态置为ThreadState.AbortRequested后就立马返回了,而线程真正结束后的状态应该是ThreadState.Aborted,所以一定要注意在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值或者调用Thread.Join方法来确保被终止线程已经真正停止,只有当Thread.ThreadState属性为Aborted或Thread.Join方法返回时,才表示线程真正结束了。

     

    下面我就写一个示例代码来说明在调用Thread.Abort方法后,怎样保证线程停止后代码才会继续执行

    var thread = new Thread(
        new ThreadStart(
            () =>
                {
                    while (true)
                    {
                        //该线程会进行无限循环,自己不会结束
                        Thread.Sleep(100);
                    }
                }));
    
    thread.IsBackground = true;
    thread.Start();//启动线程
    
    thread.Abort();//调用Thread.Abort方法试图强制终止thread线程
    
    //上面调用Thread.Abort方法后线程thread不一定马上就被终止了,所以我们在这里写了个循环来做检查,看线程thread是否已经真正停止。其实也可以在这里使用Thread.Join方法来等待线程thread终止,Thread.Join方法做的事情和我们在这里写的循环效果是一样的,都是阻塞主线程直到thread线程终止为止
    while (thread.ThreadState!=ThreadState.Aborted)
    {
        //当调用Abort方法后,如果thread线程的状态不为Aborted,主线程就一直在这里做循环,直到thread线程的状态变为Aborted为止
        Thread.Sleep(100);
    }
    
    //当跳出上面的循环后就表示我们启动的线程thread已经完全终止了

     

     

    不过请记住使用Thread.Abort方法来终止正在执行的线程并不是一个好的方法,因为Abort方法是通过在线程上抛异常来终止线程的,这样可能会产生一些意想不到的问题。最好的办法是在启动的线程中加信号灯,当想要终止线程执行时就更改信号灯的状态,启动的线程当读到信号灯状态改变后自己结束代码的执行,这才是最安全的做法。

    转载于:https://www.cnblogs.com/OpenCoder/p/4587249.html

    展开全文
  • java点滴之Thread的停止执行的方法

    千次阅读 2014-05-12 11:33:49
    暂停当前正在执行的线程对象,并执行其他线程。 yield()应该做的是当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是相 同优先级的线程之间适当的轮转执行...
    展开全文
  • Java——线程的停止

    2017-10-15 11:40:37
    /*线程的停止:stop方法已经过时了,那么只能是当线程的任务代码执行线程自然结束 任务代码中通常都有循环,所以只要循环停下来,线程停下来 方法:定义一个变量,然后控制循环stop():已过时。该方法具有...
    /*线程的停止:stop方法已经过时了,那么只能是当线程的任务代码执行完线程自然结束
    任务代码中通常都有循环,所以只要让循环停下来,线程就能停下来
    方法:定义一个变量,然后控制循环
    
    stop():已过时。该方法具有固有的不安全行,用Thread.stop来终止线程将
    释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查ThreadDeath
    异常的一个自然后果),如果以前受这些监视器保护的任何对象都处于一种
    不一致的状态,则损坏的对象将其对其他程序可见,这有可能导致任意的行为,
    stop的许多实用都应由只修改某些变量以指示目标线程应该停止运行的代码来
    取代,目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从
    运行方法依次返回,如果目标线程等待很长时间(例如基于一个条件变量),
    则应使用interrupt方法来中断该等待
    
    */
    class Demo implements Runnable{
        boolean flag = true;
    
        public synchronized void run(){
            while(flag){
                //如果线程一上来就等待,程序将结束不了
                //线程进入等待状态,为了让线程结束,只能强制结束线程的等待状态
                try{
                    wait();
                }
                catch(InterruptedException e){
                    e.printStackTrace();
                    flag = false;
                }
    
                System.out.println(Thread.currentThread().getName()+"...Hello World!");
            }
        }
    }
    class test{
        public static void main(String[] args){
            Demo demo = new Demo();
    
            Thread t1 = new Thread(demo);
            Thread t2 = new Thread(demo);
    
            t1.start();
            t2.start();
    
            try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}
    
            int i = 1;
            while(true){
                if(i++==500){
                    //demo.flag = false;
                    //当调用interrupt时,线程就会发生异常,异常后将flag改为false,线程就能结束
                    t1.interrupt();
                    t2.interrupt();
                    break;
                }
            }
        }
    }
    展开全文
  • 停止线程

    2017-05-02 17:49:33
     线程的消亡不通过调用stop()命令,而是run()方法自然结束。stop()方法是不安全,已经废弃。  停止线程推荐方式:设定一个标志变量,在run()方法中是一个循环,由该标志变量控制循环是继续执行还是跳出...
  • 一般情况下,线程自然执行完或抛出异常时会停止工作,那么如何主动让线程安全停止呢? stop()停止方法、resume()继续执行方法、suspend()挂起方法 这三个方法在早期时候是有,但现在已被废弃。因为这些方法过于...
  • sleep()方法属于Thread类,主要作用是当前线程停止执行,把cpu给其他线程执行,但不会释放对象锁和监控状态,到了指定时间后线程又会自动恢复运行状态 注意:线程睡眠到期自动苏醒,并返回到可运行状态,...
  • java多线程停止线程

    2016-07-12 21:00:00
    两个线程都冻结了,就不唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出时候,里面两个线程都处于冻结状态,这样就卡住了5.try catch 有异常,catch...
  • 线程常用几个方法汇总

    千次阅读 2018-02-19 17:52:14
    解说编程最近学习并发编程遇到不少问题,就顺手总结了有关多线程的几个常用的方法sleep()sleep()方法属于Thread类,主要的作用是当前线程停止执行,把cpu给其他线程执行,但不会释放对象锁和监控的状态,到了...
  • sleep()方法属于Thread类,主要作用是当前线程停止执行,把cpu给其他线程执行,如果有锁,不会释放锁,等睡眠期满之后,恢复为可运行状态,等到切换为运行状态时继续运行。 线程睡眠到期后自动苏醒,并返回到...
  • 开发者总尝试对自己的代码有更多的控制。“那个还在工作的线程马上停止下来”就是诸多要求中的一种。然而事与愿违,这里面...以最传统的Thread.Abort方法为例,如果线程当前正在执行的是一段非托管代码,那么CL...
  • 线程常用方法

    2019-01-17 09:20:14
    sleep()方法属于Thread类,主要作用是当前线程停止执行,把cpu给其他线程执行,但不会释放对象锁和监控状态,到了指定时间后线程又会自动恢复就绪状态; 注意:线程睡眠到期自动苏醒,并返回到可运行状态,...
  • Thread非静态方法join()让一个线程B“加入”到另外一个线程A尾部。在A执行完毕之前,B不工作。例如: Thread t = new MyThread();...则让线程等待5000毫秒,如果超过这个时间,则停止等待,变...
  • 开发者总尝试对自己的代码有更多的控制。例如,“那个还在工作的线程马上停止下来”。然而,并非我们想怎样就可以...以最传统的Thread.Abort方法为例,如果线程当前正在执行的是一段非托管代码,那么CLR就不会抛出...
  • 开发者总尝试对自己的代码有更多的控制。“那个还在工作的线程马上停止下来”就是诸多要求中的一种。...以最传统的Thread.Abort方法为例,如果线程当前正在执行的是一段非托管代码,那么CLR就不会抛
  • 开发者总尝试对自己的代码有更多的控制。“那个还在工作的线程马上停止下来”就是诸多要求中的一种。...以最传统的Thread.Abort方法为例,如果线程当前正在执行的是一段非托管代码,那么CLR就不会抛...
  • 停止Thread 既然可以用start方法启动一个线程对象执行,那么就应该有对应stop方法来终止(停止)线程对象执行。...那么我们就自己设计一个方案,让线程对象停止执行: 一个线程对象执行体是run

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 136
精华内容 54
关键字:

能让线程停止执行的方法