Wie starte ich den Thread in Java neu? [Duplikat]

7

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?

    
raja 22.01.2009, 07:04
quelle

8 Antworten

14

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.

    
Jon Skeet 22.01.2009 07:10
quelle
2

Wenn der Thread weiterhin ausgeführt werden soll, verwenden Sie eine Schleife.

%Vor%     
Peter Lawrey 22.01.2009 20:13
quelle
1

Innerhalb des Caches können Sie die Datei in den Fehlerordner verschieben und dann ein neues Objekt desselben Threads erstellen und erneut starten.

    
Bashar Kokash 22.01.2009 07:11
quelle
1

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 ...

    
netzwerg 22.01.2009 08:10
quelle
1

Ich bin mir nicht ganz sicher, ob das funktioniert, aber hier ist ein Versuch.

%Vor%     
John 29.12.2009 04:49
quelle
0

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%     
JMahmood 22.01.2009 08:32
quelle
0

Hier sind meine Annahmen basierend auf Ihrer Frage und Ihrer Klarstellung:

  • Jeder Thread ruft in der Methode run() nur einmal searchfile() auf und nicht in einer Schleife
  • Ihre searchfile() -Methode enthält eine Schleife und Sie möchten, dass diese Schleife auch dann weiterläuft, wenn eine Ausnahme ausgelöst wird.
  • Sie haben eine Möglichkeit, jeden Thread zu initialisieren, den Sie uns nicht zeigen (und das ist nicht besonders wichtig für diese spezifische Frage)
  • searchfile() deklariert nicht, dass es Exception wirft
  • Sie verwenden kein Protokollierungsframework, sondern verwenden stattdessen System.out (obwohl die Verwendung eines Protokollierungsframeworks eine wirklich gute Idee ist)
  • Java 5 ist in Ordnung (andernfalls müssen Sie eine andere for() Schleife unterhalb von
  • verwenden

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:

%Vor%

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:

%Vor%

Da Sie unerwartete Exception s in der Hauptschleife von Thread abfangen, wird Ihr Thread nach der Verarbeitung von Exception weiterarbeiten.

    
Eddie 01.02.2009 17:05
quelle
0

Sie können problemlos mit einer Problemumgehung arbeiten. Führen Sie die benötigte Logik für einige Zeit aus und beenden Sie den Job anhand einiger Kriterien.

%Vor%

Und die Ausgabe ist

%Vor%     
yurko 17.03.2014 08:32
quelle

Tags und Links