[Java] 线程中断(一)
2012-10-23 17:39
183 查看
正常情况下,一个线程完成它所有的任务后,就会自动退出。线程所持有的资源以及线程本身都会被释放掉。但是,在有些情况下,比如某些条件发生了改变或我们已经获得了想要的结果,这时虽然线程还没有执行完毕,但是我们已经不需要它在继续执行了,这时候就可以中断正在执行的线程。
想象一下,要使一个正在运行的线程中断、不再继续运行,我们该怎么做呢?一种方法是我们可以直接把这个线程杀掉,就像在任务管理器里面结束进程那样。采用这种方式可以快速的中断线程,但是存在一定得安全隐患。因为线程正在运行着什么,我们并不清楚,它可能正在读写一个文件,或正在与网络资源通信,或动态分配了内存,或对共享资源加了锁,如果我们不分青红皂白,暴力的干掉它,危险也是显而易见。如内存无法释放,文件无法关闭,造成死锁等等。所以通过外力来中断一个正在运行的线程,显然不是一个很好的做法。
既然外力不能很好的中断一个正在运行线程,那要谁去中断它呢?知己知彼,百战百胜。当然要最了解它的人去中断它。可能有人要问,谁最了解正在运行的线程呢,答案非线程本身莫属。所以要中断一个正在运行的线程,最好的做法是让它自我了断。我们要做的事就是告诉它,嗨,你该结束了。
实际上JVM也是这样做的,每一个线程都有一个状态,表明它是否已经中断,那么我们如何获得和修改这个状态呢?可以调用Thread的interrupt()。其实这个方法做的事情也不多,主要就是修改状态为中断,告诉线程它该中断了。还可以调用Thread的isInterrupted()方法来测试线程是否处于中断状态。其实interrupt()方法调用后,仅仅是状态发了改变,线程还是会正常的继续运行,那么我们只能判断线程的中断状态,自己写代码来处理具体的中断细节。
下面的示例也说明了调用interrupt()后,仅仅是状态发了变了,线程并没有中断。
下面是执行结果:
线程执行,0次!
执行中断前,是否中断:false
执行中断后,是否中断:true
线程执行,1次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,2次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,3次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,4次!
执行中断前,是否中断:true
执行中断后,是否中断:true
可以看到在第一次执行中断前,中断状态时false,执行中断后,状态变为true。此后再执行中断,对结果没有影响。
如觉得文章有不对之处,敬请指出,共同讨论!
想象一下,要使一个正在运行的线程中断、不再继续运行,我们该怎么做呢?一种方法是我们可以直接把这个线程杀掉,就像在任务管理器里面结束进程那样。采用这种方式可以快速的中断线程,但是存在一定得安全隐患。因为线程正在运行着什么,我们并不清楚,它可能正在读写一个文件,或正在与网络资源通信,或动态分配了内存,或对共享资源加了锁,如果我们不分青红皂白,暴力的干掉它,危险也是显而易见。如内存无法释放,文件无法关闭,造成死锁等等。所以通过外力来中断一个正在运行的线程,显然不是一个很好的做法。
既然外力不能很好的中断一个正在运行线程,那要谁去中断它呢?知己知彼,百战百胜。当然要最了解它的人去中断它。可能有人要问,谁最了解正在运行的线程呢,答案非线程本身莫属。所以要中断一个正在运行的线程,最好的做法是让它自我了断。我们要做的事就是告诉它,嗨,你该结束了。
实际上JVM也是这样做的,每一个线程都有一个状态,表明它是否已经中断,那么我们如何获得和修改这个状态呢?可以调用Thread的interrupt()。其实这个方法做的事情也不多,主要就是修改状态为中断,告诉线程它该中断了。还可以调用Thread的isInterrupted()方法来测试线程是否处于中断状态。其实interrupt()方法调用后,仅仅是状态发了改变,线程还是会正常的继续运行,那么我们只能判断线程的中断状态,自己写代码来处理具体的中断细节。
下面的示例也说明了调用interrupt()后,仅仅是状态发了变了,线程并没有中断。
Thread t3 = new Thread(new Runnable(){ public void run() { for (int i = 0; i < 5; i++) { System.out.println("线程执行," + i + "次!"); System.out.println("执行中断前,是否中断:" + Thread.currentThread().isInterrupted()); Thread.currentThread().interrupt(); System.out.println("执行中断后,是否中断:" + Thread.currentThread().isInterrupted()); } }}); t3.start();
下面是执行结果:
线程执行,0次!
执行中断前,是否中断:false
执行中断后,是否中断:true
线程执行,1次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,2次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,3次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,4次!
执行中断前,是否中断:true
执行中断后,是否中断:true
可以看到在第一次执行中断前,中断状态时false,执行中断后,状态变为true。此后再执行中断,对结果没有影响。
如觉得文章有不对之处,敬请指出,共同讨论!
相关文章推荐
- java线程的中断理解
- java线程阻塞中断和LockSupport的常见问题
- Java并发——线程中断学习
- java 多线程6: 中断机制 优雅的终止java线程
- 从头认识java-17.2 线程中断(interrupt)
- Java线程阻塞中断和LockSupport问题
- java线程的中断(interrupt)
- Java线程(四):线程中断、线程让步、线程睡眠、线程合并
- 如何中断线程in Java
- 深入理解Java并发机制(5)--线程、中断、Runnable、Callable、Future
- Java线程(四):线程中断、线程让步、线程睡眠、线程合并
- Java多线程——1 中断线程
- Java多线程——如何中断线程
- java 多线程学习笔记之 线程中断
- 从头认识java-17.2 线程中断(interrupt)
- Java中如何中断线程?
- java线程之中断interrupt详解
- java 线程 在阻塞时终结 之中断讲解 ---thinking in java4
- Java中断线程的方法
- Java多线程/并发08、中断线程 interrupt()