1

Предполагая, что у меня есть следующий фрагмент кода:В Java FutureTask, если задача Times out, задание отменяется?

FutureTask<?> f = new FutureTask<>(() -> { Thread.sleep(5000); return 1 + 2; }) 

myExecutor.execute(f); 
f.get(3, TimeUnit.SECONDS); 

Из того, что закодировано, последняя строка провалится через 3 секунды с java.util.concurrent.TimeoutException

Мой вопрос: продолжать ли реальная работа в будущем, чтобы получить казнят? Или он отменяется? Мог ли я позже, спустя еще 2 секунды, получить фактический результат, или он исчез?

ответ

2

Он по-прежнему выполняется.

Путем добавления второго f.get(3, TimeUnit.SECONDS); вы можете получить результат:

Object o2 = f.get(3, TimeUnit.SECONDS); 
System.out.println("o2 = " + o2); // prints o2 = 3 

Вы можете попытаться отменить расчет по телефону

f.cancel(true); 

Затем при извлечении объекта с

Object o2 = f.get(3, TimeUnit.SECONDS); 

он выбрасывает CancellationException

0

Выполняется ли фактическая работа внутри будущего?

Да. Выполнение задачи будет выполняться, если вы не отмените ее.

Или он отменяется?

Нет. Это не будет отменено, если вы не отмените его.

Мог ли я позже, спустя еще 2 секунды, получить фактический результат, или он ушел?

Да. Вы можете получить результат позже даже после тайм-аута.

Посмотрите на образец фрагмента кода:

Ниже кода получить статус будущего через 3 секунды тайм-аут. Я создал искусственную задержку, чтобы продемонстрировать пример. В режиме реального времени выход будет отличаться при отсутствии методов sleep().

public class FutureTaskQuery { 
    public static void main(String args[]){ 
     ExecutorService executor = Executors.newFixedThreadPool(1); 
     Future future = executor.submit(new MyCallable()); 
     try{ 
      Integer result = (Integer)future.get(3000, TimeUnit.MILLISECONDS); 
     }catch(TimeoutException e){ 
      System.out.println("Time out after 3 seconds"); 
      //future.cancel(true); 
     }catch(InterruptedException ie){ 
      System.out.println("Error: Interrupted"); 
     }catch(ExecutionException ee){ 
      System.out.println("Error: Execution interrupted"); 
     } 
     try{ 
      Thread.sleep(4000); 
      Integer result = (Integer)future.get(2000, TimeUnit.MILLISECONDS); 
      System.out.println("Result:"+result); 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
     executor.shutdown(); 
    } 
} 

class MyCallable implements Callable<Integer>{ 
    public Integer call(){ 
     try{ 
      Thread.sleep(5000); 
     } 
     catch(Exception err){ 
      err.printStackTrace(); 
     } 
     return 2; 
    } 
} 

выход:

Time out after 3 seconds 
Result:2 

Если вы отмените комментарий ниже линии

future.cancel(true); 

выход:

Time out after 3 seconds 
java.lang.InterruptedException: sleep interrupted 
     at java.lang.Thread.sleep(Native Method) 
     at MyCallable.call(FutureTaskQuery.java:31) 
     at MyCallable.call(FutureTaskQuery.java:28)