2017-04-04 4 views
3

Future.cancel (false) sollte meiner Meinung nach nur dann true zurückgeben, wenn es tatsächlich möglich war, die Ausführung der Aufgabe zu verhindern.Future.cancel (false) gibt für Ausführung der Aufgabe "true" zurück

Aber vom Code unten können wir sehen, dass es widerspricht.

Da die Aufgabe abgesagt wird es nicht "Not expecting this statement!!!"

public class Test { 
    public static void main(String[] args) throws InterruptedException { 
     ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
     final boolean[] canceled = { false }; 
     ScheduledFuture<?> future = executor.schedule(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(1000); 
        if (canceled[0]) 
         System.out.println("Not expecting this statement!!!"); 
       } catch (InterruptedException e) { 
       } 
      } 
     }, 0, TimeUnit.SECONDS); 
     Thread.sleep(100); 
     canceled[0] = future.cancel(false); 

     executor.shutdown(); 
     executor.awaitTermination(2, TimeUnit.SECONDS); 
    } 
} 

Leider Ausgabe dieses Programms drucken soll, ist „diese Aussage nicht erwarten !!!“

Kann jemand dieses Verhalten erklären.

Antwort

5

Weil Sie canceled[0] = future.cancel(false); mit dem Parameter false nennen. Von javadoc von Future.cancel:

Wenn die Aufgabe bereits begonnen hat, dann bestimmt die mayInterruptIfRunning Parameter, ob der Thread diese Aufgabe ausführen soll in einem Versuch unterbrochen werden, um die Aufgabe zu beenden.

@param mayInterruptIfRunning {@code true}, wenn der Thread, der diese Aufgabe ausführt, unterbrochen werden sollte; Andernfalls dürfen in-progress Aufgaben

abzuschließen Wenn Sie cancel nennen, hat Ihre Aufgabe bereits begonnen und es Ihnen ermöglichen, es zu vollenden, so Abbruchvorgang tatsächlich erfolgreich ist und true zurückkehren, wenn Sie canceled[0] = future.cancel(true); rufen, Sie‘ Ich sehe die Ausgabe nicht.

0

In Ihrem Code wird boolean[] canceled zwischen zwei Threads geteilt und es gibt keinen synchronisierten Zugriff auf diese Variable. Also, die Ergebnisse werden unerwartet sein. Auch aus der Dokumentation von https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel(boolean) wird false zurückgegeben, wenn die Aufgabe nicht abgebrochen werden konnte, normalerweise weil sie bereits normal beendet wurde. Versuchen Sie ein Protokoll nach dem Abbrechen der Aufgabe Hinzufügen zu sehen, die man zuerst ausgeführt wird (obwohl es nicht immer helfen kann)

+0

In meinem Fall ist es wahr. Daher wird die Frage ausgelöst –

+0

Versuchen Sie, die Ruhezeit in der Hauptmethode zu erhöhen. Sie könnten verschiedene Antworten sehen – prasanth

+0

Wer gab +1 auf diese Frage so schnell, es bekam +1 in seinen ersten 15 Sekunden ... –

Verwandte Themen