在长任务的运行过程中,有时我们需要提前中断任务的执行,以保持对用户操作的响应性,而在新版JAVA中,已没有能终止线程执行的方法(Thread.stop()已废除),在Thread提供的内置方法中,能影响Thread执行节奏的方法也就只有interrupt()了,那么所有的线程都能对中断进行响应吗?
看如下的例子:
static class PrimeThread extends Thread {
public void run() {
try {
// 无限循环
while(true) {
// 处理具体的业务
Thread.yield();
}
} finally {
// 只要有异常,则进入此执行步骤
System.out.println("线程已终结");
System.exit(0);
}
}
}
启动线程与中断的代码如下:
PrimeThread pt = new PrimeThread();
pt.start();
System.out.println("准备中断!");
// 中断线程
pt.interrupt();
在上面的例子中,虽然我们调用了interrupt()方法,但线程始终都无法响应中断请求,原因在于我们的业务代码都是无法响应中断请求的。
换种说法,主要是我们代码中的Thread.yield()没有抛出中断异常,换为Thread.sleep()则可以正常处理中断请求,这也是Thread.yield()与Thread.sleep()的另一个区别。
另外需要注意的是,即使我们的代码能够响应中断,但在一次循环没有完成之前,或者说没有执行到能够响应中断的指令位置,依旧无法响应中断。
结论
Thread.interrupt只是为线程增加了中断状态,还需要我们进行手动处理,更重要的是,我们调用的代码还必须支持中断状态的响应(能捕获中断异常,请参见本例中Thread.yield()与Thread.sleep()的差异),另外,从上面的例子可以看出,如果能让线程抛出异常,也是中断线程的一种方法,如提前调用InputStream的close()方法。