Was sind die verschiedenen Möglichkeiten, die Dead-Thread zurück zu Runnable Zustand zu bringen.Wie kann ein toter Thread neu gestartet werden?
Antwort
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.
Können Sie die Quelle dieses Bildes angeben? – Uooo
+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 –
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
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).
mehr lesen Von Here über Lebenszyklus von Threads.
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.Executor
Runnable
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
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.
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.
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.
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.
- 1. NGINX-Server kann nicht neu gestartet werden
- 2. Nginx kann nicht neu gestartet werden
- 3. Wie kann man wissen, ob ein MapReduce-Job neu gestartet wurde oder neu gestartet wurde?
- 4. Warum der App-Dienst neu gestartet und nicht neu gestartet werden kann?
- 5. Wie wird ein Knotenserver automatisch neu gestartet?
- 6. Python beendeten Thread kann nicht neu starten
- 7. Verbindung verweigert, wenn ein Thread für webscrapper neu gestartet werden soll
- 8. Wie kann überprüft werden, ob der Befehl im Thread erfolgreich in Java gestartet wurde und ein anderer Thread gestartet werden kann?
- 9. Ein Spring-Batch-Job konnte nicht neu gestartet werden.
- 10. Docker-Daemon kann nicht ordnungsgemäß neu gestartet werden
- 11. NotificationListenerService stoppte und kann ohne Neustart nicht neu gestartet werden
- 12. Aktivität kann nach Klicken auf Benachrichtigung nicht neu gestartet werden
- 13. SonarQube kann während der Plugin-Entwicklung nicht neu gestartet werden
- 14. Loader kann nicht neu gestartet werden, nachdem Ausrichtung geändert
- 15. Android, App neu gestartet, nachdem Sperrbildschirm gestartet
- 16. Muss .NET Framework 4.0 neu gestartet werden?
- 17. Wie kann ein Dienst auf einem passwortgeschützten Computer mithilfe von Python remote neu gestartet werden?
- 18. Wie kann das gleiche Volume in Docker wieder verwendet werden, wenn ein Container neu gestartet wird?
- 19. LocalDB kann nicht gestartet werden
- 20. Wie wird ein getöteter Dienst automatisch neu gestartet?
- 21. Node.js Kue Wie fehlgeschlagene Jobs neu gestartet werden
- 22. Wie kann ein Thread in Java wiederverwendet werden?
- 23. Cygpath kann nicht gestartet werden
- 24. Accumulo kann nicht gestartet werden
- 25. Kann ein Standard-Thread für den Thread Pool wiederverwendet werden?
- 26. kann nicht gestartet werden Mercurial
- 27. kann nicht gestartet werden mySQL
- 28. ServiceMix kann nicht gestartet werden
- 29. Warum muss CruiseControl.NET nach GetCcNetConfigFiles neu gestartet werden?
- 30. Kann nicht gestartet werden Gitblit GO
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
Sie können einen Thread nicht neu starten! –
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. –