Ich habe ein Programm erstellt, das nach Dateien in einem Quellordner sucht. Wenn eine Datei gefunden wird, verarbeitet sie diese Datei und verschiebt sie in einen Zielordner. Anschließend sucht sie im Quellordner nach einer neuen Datei. Es muss weiterhin den Quellordner für eine Datei überprüfen.
Ich habe einen Thread verwendet, um nach Dateien im Quellordner zu suchen. Das Problem, auf das ich stoße, ist, wenn während der Dateiverarbeitung eine Ausnahme ausgelöst wird, der Thread gestoppt wird. Ich möchte, dass der Thread auch dann ausgeführt wird, wenn eine Ausnahme ausgelöst wird. Er muss die Datei, die den Fehler verursacht hat, in einen anderen Ordner verschieben und im Quellordner nach einer neuen Datei suchen. Wie kann ich den Thread weiterlaufen lassen?
ZB:
%Vor%Aktualisieren :
Ich sollte in meiner Frage klarer sein. Eigentlich gibt es 4 Quellordner und 4 Zielordner. Ich muss die gleiche Operation in jeder Quelle durchführen & amp; Zielpaar. Also habe ich 4 Threads in einer Klasse erstellt und mache die Operation in einer separaten Klasse.
%Vor%Der Thread hört nicht auf zu laufen, obwohl er irgendeine Ausnahme in der Mitte aufgefangen hat. Wie kann ich das tun?
Wenn ein Thread aufgrund einer nicht abgefangenen Ausnahme abstürzt, ist die Antwort einfach: Fange die Ausnahme an einer geeigneten Stelle, damit du weitermachen kannst. Entweder fangen Sie die Ausnahme innerhalb Ihrer Suchdatei-Methode ab oder rufen Sie die Suchmethode in einer Schleife auf.
Wenn der Thread weiterhin ausgeführt werden soll, verwenden Sie eine Schleife.
%Vor%Innerhalb des Caches können Sie die Datei in den Fehlerordner verschieben und dann ein neues Objekt desselben Threads erstellen und erneut starten.
Wenn ich Sie nicht falsch verstanden habe, fehlt Ihrem Code die "keep running" -Natur, d. h. Sie müssen irgendwo eine Schleife haben:
%Vor%Beachten Sie, dass dies nur eine sehr einfache Erweiterung Ihres Beispiels ist. es fehlt noch die Parametrisierung der SearchTask, um tatsächlich für einen Ordner spezifisch zu sein, Handhabung von Dateien & amp; Ausnahmen, usw. Wie in früheren Antworten erwähnt, sollte Ihre SearchTask Runnable implementieren (ich bevorzuge Callable ...), und IMHO ist es immer besser, einen ExecutorService zu verwenden, als Threads manuell zu erzeugen. hoffe das hilft ...
Sie haben gesagt, dass die Exception während des Dateiprozesses ausgelöst werden könnte. Daher habe ich% code_de% in einen try-catch-Block gesetzt. aber wenn es während der Suche ausgelöst wird, können Sie es auch in einen Versuch-Fang setzen.
%Vor%Hier sind meine Annahmen basierend auf Ihrer Frage und Ihrer Klarstellung:
run()
nur einmal searchfile()
auf und nicht in einer Schleife searchfile()
-Methode enthält eine Schleife und Sie möchten, dass diese Schleife auch dann weiterläuft, wenn eine Ausnahme ausgelöst wird. searchfile()
deklariert nicht, dass es Exception
wirft
System.out
(obwohl die Verwendung eines Protokollierungsframeworks eine wirklich gute Idee ist)
for()
Schleife unterhalb von Mit diesen Annahmen wollen Sie nicht ein Exception
in Ihrer run()
-Methode abfangen, außer zum Zweck der Protokollierung, dass etwas sehr falsch gelaufen ist:
Beachten Sie, dass der Code RuntimeException
abfängt. Fange immer die spezifischste Exception
, die das tut, was du brauchst. Was Sie dann brauchen, ist etwas wie das folgende in Ihrer searchfile()
-Methode:
Da Sie unerwartete Exception
s in der Hauptschleife von Thread
abfangen, wird Ihr Thread nach der Verarbeitung von Exception
weiterarbeiten.
Tags und Links java multithreading exception