Heim >Java >javaLernprogramm >Wie kann ExecutorService die Thread-Timeout-Behandlung gegenüber TimerTask verbessern?

Wie kann ExecutorService die Thread-Timeout-Behandlung gegenüber TimerTask verbessern?

Linda Hamilton
Linda HamiltonOriginal
2024-12-20 05:01:12899Durchsuche

How Can ExecutorService Improve Thread Timeout Handling Over TimerTask?

Thread-Timeouts: Alternative Ansätze

Timeouts innerhalb von Threads kann zwar von TimerTask verarbeitet werden, ist jedoch nicht die optimalste Lösung. Erwägen Sie stattdessen die Verwendung von ExecutorService, da es einen umfassenden Ansatz für Thread-Management und Zeitüberschreitungen bietet.

Mit ExecutorService können Sie eine aufrufbare Aufgabe erstellen und zur Ausführung übermitteln. Nach der Übermittlung kann die Aufgabe über ein Future-Objekt überwacht werden. Durch die Angabe eines Timeouts in der Future#get()-Methode können Sie steuern, wie lange der Thread ausgeführt werden soll, bevor eine Ausnahme ausgelöst wird.

Hier ist eine Beispielimplementierung:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Test {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        // Replace this with your long-running task.
        Thread.sleep(4000);
        return "Ready!";
    }
}

Hier In diesem Szenario wird die Aufgabe 4 Sekunden lang ausgeführt, bevor sie abgeschlossen wird. Wenn das Timeout auf 5 Sekunden erhöht wird, wird die Aufgabe beendet, ohne dass sie beendet wird. Wenn das Timeout auf eine kürzere Dauer eingestellt ist, wird eine TimeoutException ausgelöst und die Aufgabe abgebrochen.

Um nach Thread-Unterbrechungen innerhalb der lang laufenden Aufgabe zu suchen, verwenden Sie while (!Thread.interrupted()) ) { ... } Schleife. Auf diese Weise kann die Aufgabe bei Bedarf ordnungsgemäß beendet werden.

Das obige ist der detaillierte Inhalt vonWie kann ExecutorService die Thread-Timeout-Behandlung gegenüber TimerTask verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn