我谷歌杀死java线程的解决方案。并且存在两种解决方案:
但他们两个都不适合我。在我的帖子中,我称第三方api需要很长时间才能完成。如果花费太多时间,我想让用户取消这个帖子。
那我怎么能杀掉这个帖子呢?提前谢谢。
答案 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
,如果不是,则进行纾困。
这样做的好处是,当你完成后你仍然可以清理。运行方法完成后,线程将自动终止。