Geplanter Executor Service mit einem Thread

Sep 02 2020

Ich habe einen Beispielcode für Scheduled Executor Service, der von der Oracle-Site stammt. Es erstellt einen ScheduledExecutorService mit der Kernpoolgröße o 1. Es führt zwei Jobs aus: Zuerst wird eine wiederholte Aufgabe gestartet, die in festgelegten Intervallen ausgeführt wird, und dann wird dieselbe Aufgabe und der Dienst selbst nach einer Verzögerung beendet.

 ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(1);
         //This will keep executing the task at fixed interval
         ScheduledFuture<?> futureTask = scheduledService.scheduleAtFixedRate(new RepeatedTask(), initialDelay, interval, TimeUnit.SECONDS);
         //A future task is returned which can be used to cancel the execution after sometime
         //Here we will cancel our repeated task after 100 seconds
         scheduledService.schedule(new TaskStopper(futureTask, scheduledService), 100, TimeUnit.SECONDS);

Der Code für wiederholte Aufgaben:

public class RepeatedTask implements Runnable{
    int count = 0;
    @Override
    public void run() {
        count++;
        System.out.println(count + ". Beep");
    }

}

Die Stoppaufgabe

@Override
    public void run() {
        mFutureTask.cancel(true);
        System.out.println("Task stopped");
        mExecutorService.shutdownNow();
        boolean shutDown = mExecutorService.isShutdown();
        if(shutDown) {
            System.out.println("Executor shutdown");
        }else {
            System.out.println("Executor not shutdown");
        }
    }

Ich möchte verstehen, wie es mit einem einzelnen Thread im Thread-Pool funktioniert. Da unser Executor-Service zwei Aufgaben ausführt und beide fast gleichzeitig startet, sollten wir nicht zwei Threads haben, dh einen ScheduledExecutorService mit einer Kernpoolgröße von 2.

Es funktioniert aber gut. Ich möchte nur verstehen, warum es mit einem einzelnen Thread gut funktioniert.

Antworten

2 RishabhSharma Sep 02 2020 at 08:44

Für jeden Thread-Pool (einschließlich ScheduledThreadPool) kann die Anzahl der Threads geringer sein als die Anzahl der Aufgaben. Thread-Pools haben intern eine Warteschlange mit Aufgaben, in der eine Aufgabe warten muss, wenn kein Thread verfügbar ist, um die Aufgabe auszuführen.

In Ihrem Beispiel müssen bei t = 100 Sekunden zwei Aufgaben ausgeführt werden. Da nur ein Thread verfügbar ist, führt er die erste Aufgabe aus (während der zweite in der Warteschlange wartet). Sobald die erste Aufgabe abgeschlossen ist, wählt der Thread die zweite Aufgabe aus der Warteschlange aus und schließt sie ab.

Sie können die Thread-ID in beiden Aufgaben ausdrucken und überprüfen, ob sie tatsächlich von demselben Thread verarbeitet werden.

Bearbeiten: Grundsätzlich wird die in einem festen Intervall geplante Aufgabe mehrmals mit festen Intervallen dazwischen ausgeführt. Während dieser Intervalle ist unser einzelner Thread im Pool inaktiv und kann andere Aufgaben zur Ausführung auswählen. So führt ein einzelner Thread beide Aufgaben aus.