我一直在尝试杀死因IO操作繁重而挂起的线程。
我本可以尝试thread.destroy
或thread.stop
,但已被弃用
例如,看看下面的代码
public class ThreadCheck {
private static int cnt = 0;
public static void main(String args[]) throws InterruptedException, ExecutionException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Running tasks");
while (condition) {
// **** Some IO operation that take forever ****
System.out.println("iteration " + cnt++);
if (Thread.currentThread().isInterrupted()) {
System.out.println("Breaking loop");
return;
}
}
}
});
t1.start();
TimeUnit.SECONDS.sleep(5);
t1.interrupt();
System.out.println("thread destroyed..");
}
}
问题是我已经添加了interrupt
调用,但它永远不会完成IO调用,所以我可以在这种情况下杀死线程
答案 0 :(得分:0)
尝试遵循此page中提到的此技术:
如何停止等待很长时间的话题(例如输入)?
这是Thread.interrupt方法的用途。相同的基于状态的" 可以使用上面显示的信令机制,但状态改变 (blinker = null,在前面的例子中)之后可以调用 Thread.interrupt,中断等待:
public void stop() {
Thread moribund = waiter;
waiter = null;
moribund.interrupt();
}
要使这种技术发挥作用,任何抓住的方法都至关重要 中断异常,并不准备立即处理它 重申例外。我们说重申而不是重新抛出, 因为并不总是可以重新抛出异常。如果 捕获InterruptedException的方法未声明为throw 这个(已检查)异常,然后它应该"重新中断自己"随着 以下咒语:
Thread.currentThread().interrupt();
这确保了Thread会将InterruptedException重新加载为 能够尽快完成。
如果某个帖子没有响应Thread.interrupt怎么办?
在某些情况下,您可以使用特定于应用程序的技巧。例如, 如果线程正在等待已知套接字,则可以关闭套接字 导致线程立即返回。不幸的是,真的 不是任何一般工作的技术。应该注意到 所有等待线程都没有响应的情况 Thread.interrupt,它也不会响应Thread.stop。这样 案例包括故意拒绝服务攻击和I / O操作 thread.stop和thread.interrupt无法正常工作。