7 Stimmen

Wie kann ich in Java auf dem Hauptthread einen Timeout um bestimmten Code festlegen?

Ich suche nach Funktionalität in Java, die identisch mit der in Ruby ist:

SystemTimer.timeout_after(30.seconds) do   etwas tun end

Ich könnte dies erreichen, indem ich einen Thread forke und ihn dann nach einer Weile beende, aber gibt es einen einfacheren Weg?

2voto

willcodejavaforfood Punkte 41426

Können Sie nicht einfach den Java Timer verwenden?

Ein Werkzeug für Threads, um Aufgaben für zukünftige Ausführung in einem Hintergrundthread zu planen. Aufgaben können einmalig oder wiederholt in regelmäßigen Abständen geplant werden.

0voto

David Rabinowitz Punkte 28911

Sie können einen ThreadPoolExecutor erstellen, der eine invokeAll-Methode hat, die ein Timeout als Parameter erhält.

0voto

Lukas Punkte 224

Was Sie suchen, ist das CompletableFuture (Link führt zur offiziellen JavaDoc) ab Java 8.

Die Verwendung könnte so aussehen:

public static  Optional of(PrivilegedAction action, Duration duration) {

    final CompletableFuture handler = CompletableFuture.supplyAsync(() -> action.run());
    V retval = null;
    try {
        retval = handler.get(duration.toMillis(), TimeUnit.MILLISECONDS);
    } catch (TimeoutException te) {
    } catch (Exception e) {
        try {
            handler.cancel(true);
        } catch (CancellationException ce) {
        }
    }
    return Optional.ofNullable(retval);
}

Eine von mir erstellte Hilfsklasse: (Deutsche Kommentare) DTimeout (Ansehen auf pastebin)

-1voto

Mork0075 Punkte 5825

Führen Sie es entweder in einem Thread aus oder tun Sie etwas Ähnliches:

void methode() {
    long endTimeMillis = System.currentTimeMillis() + 10000;
    while (true) {
        // Methodenlogik
        if (System.currentTimeMillis() > endTimeMillis) {
            // Führen Sie eine Aufräumaktion durch
            return;
        }
    }
}

Wie Sie sehen können, funktioniert dies nicht für alle Arten von Methoden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X