我有以下代码:
public class Application1 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
List> callableTasks = new ArrayList<>();
callableTasks.add(new LogDownloadCallable());
callableTasks.add(new LogDownloadCallable());
callableTasks.add(new LogDownloadCallable());
callableTasks.add(new LogDownloadCallable());
callableTasks.add(new LogDownloadCallable());
List> futures =null;
try {
futures = executorService.invokeAll(callableTasks, 1090, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
System.out.println("invokeall inturrupted !!");
}
executorService.shutdownNow();
}
}
class LogDownloadCallable implements Callable {
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" 。 但这不会发生。 有人可以帮助我理解为什么吗? 如果我放一个Thread.sleep(2000); 在public Boolean call() throws Exception {的try块中,在for循环之前public Boolean call() throws Exception { ,然后得到了InterruptedException。 这种行为很奇怪。 PS:这只是我用来说明问题的一个虚构示例。