1

Hier ist der Code:Warum wartet das Programm darauf, dass der schedule() beendet wird, aber nicht auf scheduleWithFixedDelay() wartet?

ScheduledExecutorService service = null; 
try { 
    service = Executors.newSingleThreadScheduledExecutor(); 
    Runnable task1 =() -> System.out.println("Executed only once"); 
    Runnable task2 =() -> System.out.println("Executed repeatedly"); 

    service.schedule(task1, 5, TimeUnit.SECONDS); 
    service.scheduleWithFixedDelay(task2, 6, 2, TimeUnit.SECONDS); 
} finally { 
    if (service != null) { 
     service.shutdown(); 
    } 
} 

Wenn Sie den obigen Code Ausführung des Programms 5 Sekunden wartet Zeitplan ausgeführt(), aber danach wird es beendet, ohne dass die scheduleWithFixedDelay läuft().

Ich vermute, der Grund ist, dass schedule() im Gegensatz zu den scheduleWithFixedDelay() synchron ausgeführt wird, aber ich habe die Argumente dafür in den Dokumenten nicht gefunden.

Antwort

2

Das ist ein bisschen subtiler, aber ich denke, die Antwort liegt in der Formulierung der documentation for shutdown:

ein ordnungsgemäßes Abschalten Leitet, in dem zuvor eingereichten Aufgaben ausgeführt werden, aber keine neuen Aufgaben akzeptiert werden.

Ihre erste Aufgabe gilt als "zuvor übermittelte Aufgabe", daher wartet shutdown() darauf, dass sie ausgeführt wird.

Technisch wurde die wiederholende Aufgabe zuvor eingereicht, aber da es für immer wiederholt wird, ist es unmöglich, darauf zu warten. Der Versuch, dies zu tun, würde den Vertrag von shutdown() verletzen. Also würde ich sagen, dass die einzige Alternative darin besteht, zukünftige Ausführungen wiederholter Aufgaben zu ignorieren.