1

Angenommen, ich habe den folgenden Code-Schnipsel:In Java FutureTask Wenn die Aufgabe Zeitüberschreitung, wird die Aufgabe abgebrochen?

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

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

Von dem, was codiert, die letzte Zeile wird nach 3 Sekunden nicht mit java.util.concurrent.TimeoutException

Meine Frage ist: Ist die eigentliche Arbeit im Inneren Zukunft erhalten hingerichtet? Oder es wird storniert? Könnte ich später nach weiteren 2 Sekunden das tatsächliche Ergebnis abrufen, oder ist es weg?

Antwort

2

Es wird weiterhin ausgeführt.

durch eine zweite f.get(3, TimeUnit.SECONDS); hinzufügen, können Sie das Ergebnis abrufen:

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

Sie können versuchen, die Berechnung abzubrechen von

f.cancel(true); 

Dann ruft, wenn das Abrufen des Objekts mit

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

es wirft eine CancellationException

0

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) 
Verwandte Themen