做了未来超时杀死线程执行
当(提交Runnable
任务时)使用ExecutorService
和Future
对象,如果我指定的超时值未来的get函数,并当TimeoutException
抛出的底层线程被杀?做了未来超时杀死线程执行
它没有。为什么呢?除非你告诉它。
例如,在Callable的情况下,这里有一个非常有效的问题。如果你等待20秒的结果而你没有得到结果,那么你对结果不再感兴趣。那时你应该完全取消这项任务。
事情是这样的:
Future<?> future = service.submit(new MyCallable());
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true); //this method will stop the running underlying task
}
不,它不。 Morover甚至没有试图中断任务。首先Future.get超时并不这么说。其次,试试我的测试,看看它是如何表现在1秒
ExecutorService ex = Executors.newSingleThreadExecutor();
Future<?> f = ex.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished");
}
});
f.get(1, TimeUnit.SECONDS);
它打印
Exception in thread "main" java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228)
at java.util.concurrent.FutureTask.get(FutureTask.java:91)
at Test1.main(Test1.java:23)
陆续1秒任务successfullt完成
finished
嗯...那个*特别*'Future'实现没有。因为它是一个界面,所以不能对所有“未来”做详尽的陈述。 – 2013-04-26 08:11:18
Future.get(长时间超时,TimeUnit单位)不会说它会尝试停止任务。此外,有很多方法可以阻止正在运行的线程? – 2013-04-26 08:14:15
好的回应,我收回我的投诉! – 2013-04-26 08:15:39
只是一个注释:'future.cancel(true);'不**停止正在运行的底层任务,它只是将正在运行的线程的中断标志设置为true。它是你的代码负责检查这个标志并且如果它是真的,就抛出InterruptedException。 – 2015-03-31 17:09:03
@ThiagoKronig,你确定吗?从[documentation](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel(boolean)),如果您传递true,则应该中断该线程并且尝试应该失败。 – Dirk 2015-07-27 18:54:22
@Dirk,来自我们的文档:_如果任务已经启动,那么mayInterruptIfRunning参数确定执行此task_ **的线程是否应该被中断以试图停止任务**。 _Interruption_这里意味着它将设置为真,该线程的易失性标志。运行的代码必须测试这种情况才能够自行停止。代码必须自行停止。 – 2015-07-28 14:54:22