如何杀死java线程?

时间:2010-11-08 05:20:03

标签: java multithreading

我谷歌杀死java线程的解决方案。并且存在两种解决方案:

  1. 设置标志
  2. 使用Thread.interrupt
  3. 但他们两个都不适合我。在我的帖子中,我称第三方api需要很长时间才能完成。如果花费太多时间,我想让用户取消这个帖子。

    那我怎么能杀掉这个帖子呢?提前谢谢。

8 个答案:

答案 0 :(得分:5)

Thread.interrupt()是唯一通常适用的安全方法。您当然可以使用其他应用程序级信号(例如对volatile变量进行条件检查)来自行终止。其他方法(例如所有已弃用的Thread.xx方法)可能会以非确定性方式污染应用程序的状态,并且需要重新加载所有应用程序状态。

答案 1 :(得分:3)

理论上,您可以调用已弃用的Thread.stop()方法。但请注意,这可能会导致您的应用程序以意外和不可预测的方式运行......取决于第三方库实际执行的操作。 Thread.stop()和朋友基本上不安全。

最佳解决方案是修改第三方库以响应Thread.interrupt。如果你做不到,那就放弃它,找到/使用一个更好的库。

答案 2 :(得分:2)

我会将调用第三方api(需要很长时间)调入Callable<DataTypeReturnedBy3rdPartAPI>然后执行SingleThreadExecutor指定超时< / strong>即可。

按照这种方法,如果对第三方API 的调用时间超过timeOut,则该主题将 是一些代码来举例说明我的意思:

ExecutorService executor = Executors.newSingleThreadExecutor();
 try {
   //================= HERE ==================
   Future<Boolean> job = executor.submit(thirdPartyCallable);
   executor.awaitTermination(timeOut, TimeUnit.SECONDS);      
   if(!job.isDone())
     logger.debug("Long call to 3rd party API didn't finish");
   //=========================================
 } catch (Exception exc) {
     exc.printStackTrace();      
 } finally {
     if(!executor.isShutdown() )
       executor.shutdownNow();
 }

}  

private static Callable<Boolean>  thirdParytCallable = new Callable<Boolean>() {
  public Boolean call() throws Exception {
    //Call to long 3rd party API
    //.......
    for(long i = 0;i<99999991999999L;i++) {
      Thread.sleep(10L);// Emulates long call to 3rd party API
      System.out.print(".");
    }
    return Boolean.valueOf(true);//Data from 3rd party API
  }
}; 

答案 3 :(得分:1)

生成一个单独的进程并使用OS工具将其终止。您将不得不调用“C”来执行此操作,但代码不会太多。你没有说你在运行什么操作系统。

答案 4 :(得分:0)

您可以尝试Thread.stop(),但at your own risk。最理想的情况是,您正在调用的API应该有一种方法可以在需要时中断操作(如果API本身没有提供更简洁的方法来中断其进度,那么Thread.interrupt()是什么,你试过吗?)

答案 5 :(得分:0)

您可以在Thread对象上调用stop方法,但强烈建议您不要这样做。阅读:http://download.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

您是否可以自由地对API进行细微更改?这个阻塞调用是CPU绑定还是IO绑定?如果它是IO绑定的,并且您可以访问底层套接字/远程通信对象,则关闭该对象可以创建奇迹。它至少比停止线程更好。

答案 6 :(得分:0)

java.util.concurrent.FutureTask 中,超时取消的机制被视为抛出 java.util.concurrent.TimeoutException

您可以查看此信息,好像有些内容会因超时而自动中断。

答案 7 :(得分:0)

由于Thread.stop()(正确地)被弃用,通常这是通过将标志设置为true来实现的。像这样:

致电班级:

...
workListExecutor.stop()
...

WorkListExecutor.class:

boolean running = true;

void stop(){
  running = false;
}

void run(){
  while (running) {
    ... do my stuff ...
  }
}

这假设您的线程有某种主循环(通常是这种情况)。 如果循环中的代码太大,您可以定期检查running是否仍为true,如果不是,则进行纾困。

这样做的好处是,当你完成后你仍然可以清理。运行方法完成后,线程将自动终止。