码迷,mamicode.com
首页 > 编程语言 > 详细

我对java中任务取消和线程中断的一点儿理解

时间:2014-08-07 23:17:24      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:java任务取消   线程中断   

在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

我对java中任务取消和线程中断的一点儿理解

标签:java任务取消   线程中断   

原文地址:http://blog.csdn.net/aitangyong/article/details/38423507

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!