Выполняется ли фактическая работа внутри будущего?
Да. Выполнение задачи будет выполняться, если вы не отмените ее.
Или он отменяется?
Нет. Это не будет отменено, если вы не отмените его.
Мог ли я позже, спустя еще 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)