您的位置:首页 > 编程语言 > Java开发

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

2014-08-07 20:42 309 查看
在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章明确指出:中断就是用来取消任务的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: