2013-08-14 10 views
11

Was sind die verschiedenen Möglichkeiten, die Dead-Thread zurück zu Runnable Zustand zu bringen.Wie kann ein toter Thread neu gestartet werden?

+1

Keine! Es ist viel besser, wenn Sie den Zustand Ihres Threads in ein Objekt (möglicherweise ein "Runnable") umwandeln und dieses Objekt lediglich an einen neuen Thread übergeben. – phs

+0

Sie können einen Thread nicht neu starten! –

+6

Sie müssen erweiterte Zeitreisetechniken verwenden. Und Sie müssen es vermeiden, Paradoxe zu erzeugen ... wie wenn ein Thread in der Zeit zurückgeht und seinen übergeordneten Thread tötet, bevor er erstellt wird. –

Antwort

40

Thread lifecycle image

Wenn man sich das Thema Life Cycle Bild sehen, gibt es keine Möglichkeit, wieder an die neue Position gehen kann, sobald der Thread beendet wurde.

So gibt es keine Möglichkeit, den toten Thread in runnable Zustand zurück zu bringen, stattdessen sollten Sie eine neue Thread-Instanz erstellen.

+6

Können Sie die Quelle dieses Bildes angeben? – Uooo

+3

+1 schöner Beitrag. @Uooo Öffnen Sie diese [link] (http://faculty.inverhills.mnscu.edu/speng/cs1127/Notes/Ch23/LifeCycle.htm) und klicken Sie auf UML-Diagramm –

10

Vom JavaDocs ...

Es ist nie legal ist ein Thread mehr als einmal zu starten. Insbesondere kann ein Thread nicht neu gestartet werden, sobald die Ausführung abgeschlossen ist.

Sie müssen eine brandneue Instanz starten.

Vorzugsweise sind die Aktionen, die Sie ausführen möchten, in einer Runnable Schnittstelle werden sollte, auf diese Weise verpackt Sie einfach die Runnable auf eine neue Instanz von Thread

passieren kann
2

Wenn die Ausführung der Methode run() beendet ist, Wenn der Job, der gemeint ist, erledigt ist, wird er in den toten Zustand gebracht. Dies geschieht implizit durch JVM. Im toten Zustand wird das Thread-Objekt als Müll gesammelt. Es ist das Ende des Lebenszyklus von Thread. Sobald ein Thread entfernt wurde, kann er nicht erneut gestartet werden (da das Thread-Objekt nicht existiert).

enter image description here

mehr lesen Von Here über Lebenszyklus von Threads.

7

Ich vermute, Sie haben die Thread Klasse erweitert und Sie haben die run Methode überschrieben. Wenn Sie dies tun, binden Sie den ausführbaren Code an den Lebenszyklus Thread. Da ein Thread nicht neu gestartet werden kann, müssen Sie jedes Mal ein neues Thread erstellen. Eine bessere Vorgehensweise besteht darin, den Code so zu trennen, dass er in einem Thread aus einem Thread Lebenszyklus über die Schnittstelle Runnable ausgeführt wird.

Extrahieren Sie einfach die run Methode in einer Klasse, die Runnable implementiert. Dann können Sie es einfach neu starten.

Zum Beispiel:

public class SomeRunnable implements Runnable { 

     public void run(){ 
     ... your code here 
     } 
} 

SomeRunnable someRunnable = new SomeRunnable(); 
Thread thread = new Thread(someRunnable); 
thread.start(); 

thread.join(); // wait for run to end 

// restart the runnable 
thread = new Thread(someRunnable); 
thread.start(); 

Diese Praxis macht es auch einfach, wenn Sie den vorherigen Laufzustand erinnern.

public class SomeRunnable implements Runnable { 

     private int runs = 0; 

     public void run(){ 
      runs++; 
      System.out.println("Run " + runs + " started"); 
     } 
} 

PS: Verwenden eines java.util.concurrent.ExecutorRunnable s auszuführen. Dies entkoppelt die Thread-Verwaltung von der Ausführung.

Executor executor = Executors.newSingleThreadExecutor(); 

... 

SomeRunnable someRunnable = new SomeRunnable(); 
executor.execute(someRunnable); 

Nutzen Sie Executor Interfaces

4

Das Gewinde ist ein separater Prozess geringes Gewicht, die unabhängig voneinander unabhängig von anderen Threads ausführt. Sobald die Ausführung abgeschlossen ist, gibt es keine Möglichkeit, es neu zu starten.

2

Gewinde hat viele verschiedene Zustand während seiner Lebensdauer.

1 Newborn Staat

2 Runnable Staat

3 Laufend-Zustand

4 blockierten Zustand

5 Dead State

Thread sollte von oben in einem Zustand sein, und es kann durch verschiedene Methoden und Wege von einem Zustand zum anderen bewegt werden.

enter image description here

Wenn ein Thread seine run() Methode, den Lebenszyklus des speziellen Thread abgeschlossen ausführt Ende.

Wir können Thread beenden, indem wir die stop() - Methode für diesen bestimmten Thread aufrufen und ihn in den Dead State senden.

3

Die andere offensichtliche Lösung ist: Wenn Sie die Thread-Funktionalität viele Male benötigen, lassen Sie den Thread nicht sterben. Anstatt es zu verlassen und sich selbst zu beenden, schiebe in eine Weile (wahr) Schleife mit einer geeigneten Wartezeit an der Spitze. Sie können es dann "neu starten", indem Sie es signalisieren.

Dies ist viel schneller, sicherer und effizienter als das kontinuierliche Erstellen/Beenden/Zerstören von Threads.

Verwandte Themen