Beste Weg, damit umzugehen InterruptedException
Bin ich mit dem Thread.sleep(10000); also ich muss um InterruptedException. Ich kann call Thread.currentThread.interrupt () und dann werfen Sie die Ausnahme an aufrufende Klasse oder kann ich auch direkt werfen, um die aufrufende Klasse oder gibt es eine bessere Möglichkeit, damit umzugehen ?
- Sind Sie sicher, dass Sie brauchen eine
Thread.sleep
? 99% der Zeit brauchst du es nicht und sollte es nicht verwenden. - Ich m polling-Nachrichten aus einer Datei und ich warte 10 sec vor jeder iteration, also ich m mit sleep(). Kann u vorschlagen mir einen besseren Weg
- Wie werden die Informationen in die Datei geschrieben? Hast du irgendwelche Kontrolle über Sie?
- Nein, ich m nur angeschlossen, um die Datei-Pfad zum abrufen der Daten.
- Sie werden wahrscheinlich besser dran mit einem
Timer
oderScheduledExecutorService
als darum der thread - Funktioniert der Schreibprozess lock auf die Datei, oder ist die Möglichkeit einer gemeinsamen Lesen/schreiben?
- Danke @bradimus
- Lesen und schreiben ist erlaubt
- Checkout rxjava-Datei, wie hier erwähnt, stackoverflow.com/a/31202832/2160152
- Haben Sie geprüft über java.nio.Datei-Paket enthält eine Datei ändern, notification API, namens-Uhr-Service. Diese API ermöglicht es Ihnen 2 registrieren Sie ein Verzeichnis mit die Uhr service. Bei der Anmeldung, sagen Sie dem service, welche Arten von Ereignissen Sie interessiert sind: Datei-Erstellung, Löschung, änderung oder. Wenn der Dienst erkennt ein Ereignis von Interesse sind, weitergeleitet wird an die registrierte Prozess. Die eingetragene Prozess hat einen thread (oder einen pool von threads) gewidmet beobachten für alle events registriert. Wenn ein Ereignis kommt, wird Sie so behandelt, wie gebraucht.
- Dies ist eine gute alternative. Aber in meinem Fall mehr als ein Objekt ändern möchten die gleiche Datei. Was ich möchte ist, dass nur einer von Ihnen sollte in der Lage sein, die Datei zu ändern und andere nicht. So war ich mit thread. Selbst wenn ich den Prozess, bei dem u r darauf hindeutet, ich habe noch zu gehen, für die Handhabung so etwas wie unterbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie einen dedizierten thread, der looping und polling, das klingt für mich wie etwas, das beendet werden muss, wenn das Programm beendet wird; es sei denn, es ist ein daemon-thread (was Sie gerne mit ihm Weg gehen, keine chance, zu bereinigen oder in der Nähe Ressourcen) muss in der Lage sein zu handhaben Unterbrechung. Mit WatchService scheint wie eine gute Idee, aber der code, der verwendet, der WatchService noch zu wissen, wie zu behandeln Unterbrechung.
Wenn Sie schreiben ein Runnable oder Callable schläft, können Sie die InterruptedException, um zu beenden, was auch immer Schleife, die Sie tun, oder Sie können die Ausnahme abfangen und wiederherstellen das interrupt-flag, so dass die nächste überprüfung des interrupt-Flags (mit
Thread.currentThread().isInterrupted()
) sehen können, dass der thread unterbrochen wurde:Alternativ können Sie die InterruptedException, um aus der Schleife:
Wenn Sie entwickeln ein Objekt, das Sie erwarten, dass das nest im inneren von anderen Objekten, dann werfen die Ausnahme und fügen Sie die Signatur der Methode. Als ein Beispiel schauen Sie in der API-doc für Klassen in java.util.concurrent-Pakete, wie BlockingQueue, sehen Sie, wie Methoden, wie put und bieten InterruptedException werfen. Wenn Objekte, gemacht für die Parallelität sind, komponierte zusammen, die Sie benötigen, zu kooperieren (und stellen Sie sicher, dass Sie nicht den überblick verlieren, unterbrochen-status), um sicherzustellen, dass Sie sauber und enden in eine ansprechende Art und Weise.
In den meisten normalen code, sollten Sie nicht verwenden
sleep
. Oft gibt es einen besseren Weg, das zu tun, was Sie wollen.Dies ist nützlich, wenn Sie fortfahren wollen als normal, aber ohne zu warten.
ODER ich würde eine exception werfen, Sie können wickeln Sie die Ausnahme mit Ihrer Wahl.
Könnten Sie auch nicht fangen, in diesem Fall.
Es hängt davon ab, warum Sie erwarten, dass der thread unterbrochen werden. wenn ich nicht erwarte, dass ein interrupt immer, ich wickeln Sie es mit einem
AssertionError
In der Regel, rethrow, wenn Sie können, oder legen Sie die Unterbrechung-flag, wenn Sie nicht rethrow.
Einen guten Artikel über dies ist http://www.ibm.com/developerworks/library/j-jtp05236/
aus, dies ist die am meisten relevanten Auszug wäre:
Nicht unbedingt. Dabei gibt es schlaue Wege Sie zu behandeln
InterruptedException
, und es gibt dumme Wege. Wenn dein thread wird nie wirklich werden unterbrochen, dann ist es wirklich egal, welchen Weg du wählen?Natürlich, wenn Sie denken, dass Ihr code kann immer wieder verwendet werden, oder wenn Sie denken, dass andere Programmierer gehen, um es zu Lesen, dann möchten Sie vielleicht zu gehen mit der smart Weg. Wenn Sie möchten, um gute Codierung Gewohnheiten, möchten Sie vielleicht zu gehen mit der smart-Weg (viele Beispiele gibt, die nur darauf warten gefunden zu werden, die mit einer google-Suche).
Aber manchmal wollen wir einfach nur zu schreiben, ein quick hack, dass wir gehen, einmal zu benutzen und dann wegwerfen...