Heim > Java > javaLernprogramm > Wie lege ich mit ExecutorService ein Timeout für einen Thread in Java fest?

Wie lege ich mit ExecutorService ein Timeout für einen Thread in Java fest?

Barbara Streisand
Freigeben: 2024-12-16 12:55:17
Original
607 Leute haben es durchsucht

How to Set a Timeout for a Thread in Java Using ExecutorService?

So legen Sie eine Zeitüberschreitung für einen Thread fest

Wie in der ersten Anfrage angesprochen, bestehen Bedenken hinsichtlich der Einschränkung der Ausführung eines Threads Zeit. Das Ziel besteht darin, Situationen zu bewältigen, in denen ein Thread möglicherweise in eine Endlosschleife eintritt, was dazu führt, dass der übergeordnete Thread auf unbestimmte Zeit wartet.

Eine besprochene Lösung umfasst die Verwendung einer TimerTask innerhalb der run()-Methode des Threads. Ein effizienterer Ansatz besteht jedoch darin, die ExecutorService-Klasse zu nutzen. Dies bietet einen praktischen Mechanismus zum Festlegen eines Timeouts für einen Thread.

Eine Beispielimplementierung mit ExecutorService kann wie folgt veranschaulicht werden:

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 TimeoutTest {
    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 {
        Thread.sleep(4000); // Simulate a long-running task that takes 4 seconds
        return "Ready!";
    }
}
Nach dem Login kopieren

In diesem Beispiel kapselt die Task-Klasse die Long- laufende Aufgabe. Die Methode ExecutorService.submit() wird verwendet, um diese Aufgabe zur Ausführung zu übermitteln. Das von subscribe() zurückgegebene Future-Objekt bietet einen Mechanismus zum Abrufen des Ergebnisses der Aufgabe.

Die Future.get()-Methode wird mit einem Timeout-Argument von 3 Sekunden aufgerufen. Wenn die Aufgabe innerhalb dieses Zeitrahmens abgeschlossen ist, wird das Ergebnis zurückgegeben. Wenn die Aufgabe jedoch länger als 3 Sekunden dauert, wird eine TimeoutException geworfen. Im Catch-Block wird die Aufgabe abgebrochen und die Meldung „Terminated!“ angezeigt. Die Nachricht wird gedruckt.

Außerdem ist es wichtig zu beachten, dass in der Aufgabe mit langer Laufzeit eine Prüfung eingebaut werden sollte, um Unterbrechungen zu behandeln, um zu verhindern, dass die Aufgabe auf unbestimmte Zeit ausgeführt wird. Diese Prüfung kann mit Thread.interrupted() implementiert werden.

Das obige ist der detaillierte Inhalt vonWie lege ich mit ExecutorService ein Timeout für einen Thread in Java fest?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage