У меня есть следующий код:
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;
}
}
Я надеялся получить "java.lang.InterruptedException"
после тайм-аута 1090 мс. Но этого не происходит. Может кто-нибудь помочь мне понять, почему? Если я помещу Thread.sleep(2000);
в блок try в public Boolean call() throws Exception {
перед циклом for, то я получу InterruptedException. Это поведение странно. PS: это просто фиктивный пример, который я придумал, чтобы продемонстрировать свою проблему.
java.lang.InterruptedException
, когда код блокируется при вводе-выводе/блокировке, спящем режиме и т. д. В других случаях вам нужно проверить, не прерван ли текущий поток, используяThread.currentThread().isInterrupted()
- person Venkata Raju   schedule 12.02.2018