Wie implementieren Sie ein effizientes timeout in java
Gibt es n
Objekt, das einige Aktionen. Nach der Durchführung einer Aktion, ein Zeitstempel aktualisiert werden. Jetzt will ich zur Implementierung eines timeout-thread, der überprüft, ob ein Zeitstempel ist älter als zum Beispiel 60 Sekunden.
Meine erste Lösung war, das zu tun, mit einem Gewinde (while-Schleife + sleep), die ist im Besitz einer Liste mit allen Objekten, einschließlich den letzten Zeitstempel. Nun habe ich das problem, dass es eine worst-case-Szenario, in dem der thread muss 59 Sekunden plus Zeit schlafen, um zu entscheiden, für ein timeout.
Ich bin auf der Suche nach einer Lösung, wie eine Timer-wo es möglich ist, aktualisieren Sie die delay-Zeit.
Irgendwelche Ideen?
Etwas lässt mich denken, dass Sie überwachen möchten einige threads, die für eine "Arbeit abgeschlossen" - Ereignis. Könnten Sie
CountDownLatch
für diesen Zweck.Was passiert, wenn ein Objekt abgeschlossen in der Zeit? Und was passiert, wenn Sie es nicht tun? Tun Sie es Ihnen ermöglichen, weiter? oder müssen Sie stoppen? Es sind mehrere Optionen. Könntest du dein Ziel auf die Frage? und man kann die beste Lösung für dieses problem.
eine weitere Klarstellung: Wenn Sie sagen, "Es gibt n Objekt, das einige Aktionen..." ich denke mal du meinst "n threads ..." ?
InformationsquelleAutor stormsam | 2012-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, mit einem monitor-Objekt mit wait/notify sinnvoll ist (Sie können mit der Bedingung mit warten/signal, wenn Sie mit dem JDK >= 5)
Idee ist einfach:
Worker-thread:
Thread Timeout:
InformationsquelleAutor Adrian Shum
Für die Frage, es ist nicht klar, was Sie wollen mit dem timeout. Hier präsentiere ich Euch zwei Optionen zur Umsetzung eines Leichtbau-timeout: vs überwacht kontrolliert.
Überwacht Timeout
Für einen globalen timer, können Sie die
Timer
Anlage aus dem JDK:Gibt es eine ähnliche Konstruktion möglich mit einem
ScheduledExecutorService
:Bevorzuge ich die
ScheduledExecutorService
über dieTimer
Anlage, dieSchedulerExecutor
können halten einen pool von threads. Auch die zugrunde liegenden threadpool verwendet werden können, für die anderen Operationen aufrufenscheduledExecutorService.execute(...)
für die sofortige gleichzeitige Ausführung (nicht geplant), so dass es eine generische Testamentsvollstrecker Anlage, anstatt eine dedizierte timer-Funktion.In beiden Fällen müssen Sie Besondere Sorgfalt walten lassen, um sicher zu bekommen, den timeout-Wert Ihrer Objekte, die Sie überwachen. In der Regel verwenden Sie eine synchronisierte Methode in das Objekt zu Fragen, für Sie die timeout-status.
Durchgesetzt Timeout
Der ExecutorService bietet eine API zum ausführen einer Reihe von Aufgaben innerhalb einer bestimmten timeout. z.B.
Nach dieser Methode gibt, können Sie Fragen, alle Zukunft, ob es gelang innerhalb der Zeit gegeben.
InformationsquelleAutor maasg
Interrupt der thread jedes mal, wenn Sie ein update für eine timestamp. Dann wird es Schleife, finden nichts zu tun, schlafen, und wenn nichts anderes passiert, um den timestamp, erlischt es. Wenn es unterbrochen wird, ein zweites mal, um so besser. Und zu allen Zeiten es sollte schlafen nie länger als 60 minus (aktuelle Zeit minus dem ältesten timestamp).
InformationsquelleAutor user207421