Warum tritt eine IllegalThreadStateException auf, wenn Thread.start erneut aufgerufen wird

8
%Vor%

Hallo, ich erhalte ein IllegalThreadStateException , wenn ich meinen Code ausführe und ich vermute, dass ich versuche, einen Thread zu starten, der bereits gestartet wurde. Wie könnte ich töten? oder stoppe den Thread jedes Mal, um dieses Problem zu umgehen?

    
user1014888 09.11.2011, 22:59
quelle

6 Antworten

7
  

Wie kann ich den Thread jedes Mal töten oder stoppen, um dieses Problem zu umgehen?

Die Antwort ist, Sie können nicht. Nach dem Start darf Thread nicht neu gestartet werden. Dies ist in der javadoc für Thread eindeutig dokumentiert. Was Sie wirklich tun möchten, ist new eine Instanz von RemoveNonPrime jedes Mal, wenn Sie in Ihrer Schleife herumkommen.

Sie haben ein paar andere Probleme in Ihrem Code. Zuerst müssen Sie p erhöhen, bevor Sie es erneut verwenden:

%Vor%

Zweitens sind Sie möglicherweise Multithread, aber Sie sind nicht gleichzeitig. Der Code, den Sie haben, erlaubt grundsätzlich nur einen Thread gleichzeitig zu laufen:

%Vor%

Nur meine $ 0,02, aber was Sie versuchen, könnte funktionieren, aber die Logik für die Auswahl der nächstkleineren Primzahl wird nicht immer eine Primzahl wählen, zum Beispiel wenn einer der anderen Threads diesen Teil des Arrays nicht verarbeitet hat noch.

Hier ist ein Ansatz, der einen ExecutorService verwendet. Es gibt einige Leerzeichen (...), die Sie ausfüllen müssen:

%Vor%     
Tim Bender 10.11.2011, 01:16
quelle
1

Sie könnten stattdessen Runnable implementieren und einen neuen Thread ($ Runnable hier) verwenden .start () oder einen ExecutorService verwenden, um Threads wiederzuverwenden.

    
MasterCassim 09.11.2011 23:25
quelle
0

ThreadPools kann für die Bereitstellung von Aufgaben verwendet werden, um die Anzahl der Threads festzulegen. Bei der Initialisierung legen Sie die Anzahl der Threads fest. Dann fügen Sie Aufgaben für den Pool hinzu. Und nachdem Sie können blockieren, bis alle Aufgaben die Verarbeitung abgeschlossen haben. Hier ist ein Beispielcode.

    
Lycha 09.11.2011 23:40
quelle
0

Ich bin mir überhaupt nicht sicher, ob ich die Frage verstehe. Alle Methoden zum Anhalten von Threads, die von anderen Threads ausgeführt werden, sind veraltet; Die Möglichkeit, einen Thread zu stoppen, besteht darin, eine Variable überprüfen zu lassen, auf die er und ein anderer Thread zugreifen können (vielleicht eine volatile Variable), und den laufenden Thread gelegentlich zu überprüfen, um zu sehen, ob der Thread beendet werden soll besitzen.

Ich kann nicht sagen, warum / ob du den laufenden Thread eliminieren und einen anderen verwenden willst, und ich kann nicht sehen, wie die verschiedenen Threads dazu beitragen werden, dein Gesamtziel schneller auszuführen. Aber es ist möglich, dass ich die Mathematik nicht verstehe.

    
arcy 09.11.2011 23:40
quelle
0

Die Thread.isAlive () Methode kann Ihnen sagen, ob der Thread bereits gestartet wurde. Tun Sie das einfach, wo Sie Ihren Thread starten möchten:

%Vor%     
chrisbunney 09.11.2011 23:44
quelle
0
%Vor%

In Android erwähnen Dokumente immer noch, dass wir IllegalThreadStateException if the thread was already started erhalten werden.
Bei einigen Geräten wird diese Ausnahme jedoch nicht ausgelöst (getestet mit Kyocera 7.0). In einigen populären Geräten wie Samsung, HTC werfen sie die Ausnahme normalerweise

Ich antworte hier, weil die Android-Frage zu dieser Frage markiert ist.

    
Phan Van Linh 02.04.2018 07:55
quelle

Tags und Links