如何在java中杀死挂起的线程

时间:2016-04-17 15:22:10

标签: java multithreading

我一直在尝试杀死因IO操作繁重而挂起的线程。 我本可以尝试thread.destroythread.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调用,所以我可以在这种情况下杀死线程

1 个答案:

答案 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无法正常工作。