在JDK中任务就是一个Runnable或Callable对象,线程是一个Thread对象,任务是运行在某个线程中的。我们知道,让线程死亡的方式有2种:正常完成和未捕获的异常。如果想让任务结束,也只有这2种方式。
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中任务取消和线程中断的一点儿理解,布布扣,bubuko.com
时间: 2024-10-10 05:01:50