[Java] 线程中断(二)

来源:互联网 发布:ps aux grep php 编辑:程序博客网 时间:2024/04/28 10:00

        上一篇文章说明了中断线程最好的做法是让被中断的线程自己处理具体的中断过程和细节。线程的拥有者只需调用被中断线程的interrupt()方法,设置它的状态为中断,然后就不在管它。那么线程是如何中断自己的呢?这篇文章来进行大概的讨论。

        其实,如果线程的目的和作用不同,那么线程的执行过程可能完全不一样。我们在使用多线程的时候,首先需要考虑这个线程在运行的过程中需不需要被中断或者会不会被中断,如果不需要,也不会被中断,自然就不用考虑中断的问题。如果需要中断或会中断,那么肯定有中断的逻辑,即在什么情况下需要中断,在线程执行到哪里时需要判断用不用中断。在写代码前这个中断情景就已经能够确定下来了。所以在写代码时,在合适的地方需要判断当前线程的状态,如果没有中断就继续往下执行,如果已经中断,那就不再继续往下执行,而要执行具体的中断逻辑,然后退出该线程,使其持有的所有资源和线程本身都被释放掉。

        当调用了线程的start()方法后,线程就开始自行运行,它的拥有者不关心,也不知道线程是怎么在运行或此刻运行到哪里了。拥有者只是在需要中断的时候就去调用线程的interrupt()方法,然而这个方法的调用除了改变了线程的状态之外,对线程的执行没有任何影响。所以我们在线程执行过程中的某些地方肯定要检测线程的状态,只有在这些地方线程才可能中断。这样的地方可能有多个,具体在哪个地方中断就取决于调用interrupt()时线程执行到了哪里。

下面是简单的示例代码:

Thread t3 = new Thread(new Runnable(){public void run() {for (int i = 0; i < 5000; i++) {System.out.println("线程执行," + i + "次!");System.out.println("是否中断:" + Thread.currentThread().isInterrupted());if (Thread.currentThread().isInterrupted()) {break;}}}});  t3.start(); Thread.sleep(100); t3.interrupt();

执行的结果如下:
线程执行,3081次!
是否中断:false
线程执行,3082次!
是否中断:false
线程执行,3083次!
是否中断:false
线程执行,3084次!
是否中断:false
线程执行,3085次!
是否中断:true
        线程开始执行后,主线程休眠100毫秒,然后调用线程的中断方法。此时线程的循环已执行过了3084次,在3085次时检测到状态被设置为中断,然后就break了for循环,线程就退出了。
如本文中有错误的地方,敬请指出,共同讨论!

原创粉丝点击