我对java中任务取消和线程中断的一点儿理解
2014-08-07 20:42
309 查看
在JDK中任务就是一个Runnable或Callable对象,线程是一个Thread对象,任务是运行在某个线程中的。我们知道,让线程死亡的方式有2种:正常完成和未捕获的异常。如果想让任务结束,也只有这2种方式。
java中虽然提供了抢占式中断Thread.stop(),但这是很不安全的,JDK早已经将其标记成过时的了。在java中如果想取消一个任务,只能使用中断,中断是一种协作机制。也就是说,如果A线程想中断B线程,那么其实是A向B发送了一个中断请求,至于B到底会不会停止执行,取决于B的实现。如果任务能够在正常完成之前,响应外部的取消请求而终止,那么就是一个可取消的任务。
java中虽然提供了抢占式中断Thread.stop(),但这是很不安全的,JDK早已经将其标记成过时的了。在java中如果想取消一个任务,只能使用中断,中断是一种协作机制。也就是说,如果A线程想中断B线程,那么其实是A向B发送了一个中断请求,至于B到底会不会停止执行,取决于B的实现。如果任务能够在正常完成之前,响应外部的取消请求而终止,那么就是一个可取消的任务。
public class UnCanceledTask implements Runnable { @Override public void run() { while(true) { // do something; } } }这就是一个不可取消的任务,它不会理会线程的中断状态。无论该任务在哪儿个线程中运行,该任务都无法终止(除非使用已经过时的Thread.stop)。如果向线程池中ExecutorService中提交了这种无法取消的任务,那么线程池永远无法关闭,除非重启JVM。
public class CanceledTask implements Runnable { @Override public void run() { Thread thread = Thread.currentThread(); while(!thread.isInterrupted()) { // do something; } } }该任务就是一个可取消的任务,每次执行循环前,都会检查当前线程的中断状态。JDK的类库很多阻塞方法,都能够响应线程中断,抛出InterrupedtException,将线程从等待中唤醒,如Object.wait(),Thread.sleep()等方法。可以这么说,如果一个任务或线程,能够响应中断请求而提前结束,那么就是可以取消的。《java并发编程实践》一书第7章明确指出:中断就是用来取消任务的。
相关文章推荐
- 【线程】-Java线程中断的本质深入理解
- Java线程中断的本质深入理解
- 理解java线程的中断(interrupt)
- java多线程,线程中断的理解
- Java线程中断的理解和正确使用
- Java线程中断的本质深入理解
- 深入理解Java并发机制(5)--线程、中断、Runnable、Callable、Future
- Java "线程任务" 与 "线程" 概念的简单理解
- 理解Java线程的中断
- Java线程中断理解(interrupte)
- 【转】理解java线程的中断(interrupt)
- 理解java线程的中断(interrupt)
- 深入理解Java并发机制(5)--线程、中断、Runnable、Callable、Future
- Java线程中断的本质深入理解
- Java线程中断的本质深入理解(转)
- 理解Java线程的中断
- 深入理解Java并发机制(5)--线程、中断、Runnable、Callable、Future
- 深入理解Java并发机制(5)--线程、中断、Runnable、Callable、Future
- Java 基本功 之中断线程的理解
- java线程的中断理解