我正在尝试为执行程序异步调用的线程实现超时。
流程如下:
Thread-1:使用以下代码启动在线程2上运行的任务,并立即返回,而不等待Future对象结果
线程-2:漫长的进程并且会更新一些结果存储在缓存中的结果
现在,要求是在超过一些超时值后终止 Thread-2 而不阻塞Thread-1
代码段
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<Task> future = executor.submit(new Callable<Task>() {
public Task call() throws Exception {
try{
return new Task();
}catch (Exception e) {
//print stack
}
}
});
有任何见解/建议来实现这个目标吗?
答案 0 :(得分:0)
请参阅以下答案:https://stackoverflow.com/a/2733370/1299078
但是根据Thread-2的作用,你可以让线程定期结束,即在http-request或DB语句中定义超时,或者如果你有一个循环,则定义一个退出条件。通过这种方式,您可以获得更合适的解决方案,并且能够正确地释放资源。
答案 1 :(得分:0)
您无法使用Java的ExecutorService执行此操作,因为它不会将任何方法暴露给超时并终止/完成/完成新生成的线程。
但是,如果你必须这样做,那么你可以通过直接使用Thread类来实现,下面是高级方法:
t2.interrupt()
,这基本上会打断t2线程。if (Thread.interrupted()) {
),如果它被中断,那么你可以做你想做的任何事情 - 只需返回完成/杀死/完成线程。答案 2 :(得分:0)
基本的ExecutorService不提供超时功能。
您可以像@hagrawal所描述的那样自己实现超时,或者您可以使用guava,它具有非常好的实现,可以满足您的要求here