【发布时间】:2018-02-12 19:19:02
【问题描述】:
我有以下代码:
public class Application1 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
List<Callable<Boolean>> callableTasks = new ArrayList<>();
callableTasks.add(new LogDownloadCallable());
callableTasks.add(new LogDownloadCallable());
callableTasks.add(new LogDownloadCallable());
callableTasks.add(new LogDownloadCallable());
callableTasks.add(new LogDownloadCallable());
List<Future<Boolean>> futures =null;
try {
futures = executorService.invokeAll(callableTasks, 1090, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
System.out.println("invokeall inturrupted !!");
}
executorService.shutdownNow();
}
}
class LogDownloadCallable implements Callable<Boolean> {
public Boolean call() throws Exception {
try{
//This for sure takes days to complete, so should through Cancellation exception because timeout on invokeall set to 1 minute
long val = 0;
for (long i = 0; i < Long.MAX_VALUE - 5000; i++) {
val += i;
}
System.out.println("complete");
}catch(Exception e){
System.out.println("Exception ! " +e.toString()+ Thread.currentThread().getId());
return false;
}
return true;
}
}
我希望在 1090 毫秒超时后得到"java.lang.InterruptedException"。但这不会发生。有人可以帮我理解为什么吗?
如果我在 for 循环之前将 Thread.sleep(2000); 放在 public Boolean call() throws Exception { 的 try 块中,那么我会收到 InterruptedException。这种行为很奇怪。
PS:这只是我为了展示我的问题而编造的一个虚拟示例。
【问题讨论】:
-
当代码被 io/lock 阻塞,睡眠等时,你会得到
java.lang.InterruptedException。在其他情况下,你需要使用Thread.currentThread().isInterrupted()检查当前线程是否被中断 -
那么在 invokeAll 中设置超时有什么意义呢?
标签: java multithreading executorservice callable