Wird die eigentliche Arbeit in Zukunft weiterhin ausgeführt?
Ja. Die Ausführung der Aufgabe wird ausgeführt, sofern Sie sie nicht abbrechen.
Oder es wird abgebrochen?
Nein. Es wird nur abgebrochen, wenn Sie es abbrechen.
Konnte ich, später, nach weiteren 2 Sekunden, das tatsächliche Ergebnis abrufen, oder ist es weg?
Ja. Sie können das Ergebnis später auch nach einem Timeout erhalten.
Hier finden Sie aktuelle Beispielcode-Schnipsel:
Im Folgenden Code den Status der Zukunft nach 3 Sekunden Time-out zu bekommen. Ich habe künstliche Verzögerung geschaffen, um das Beispiel zu demonstrieren. In Echtzeit wird die Ausgabe in Abwesenheit von sleep()
Methoden unterschiedlich sein.
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;
}
}
Ausgang:
Time out after 3 seconds
Result:2
Wenn Sie un-Kommentar unterhalb der Linie
future.cancel(true);
Ausgang:
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)