2010-06-29 6 views
5

Ich habe ein Beispiel für isAlive() Methode Java-Threading versucht. Aber ich fand, dass isAlive() Methode false zurückgibt, auch wenn Thread bereits gestartet wurde. Kann mir bitte jemand sagen, was mache ich falsch? Hier ist das Code-Snippet.isAlive() Methode von Java-Thread funktioniert nicht richtig?

package app; 

public class ThreadAliveDemo { 

    public static void main(String[] args) { 

     Thread myThread; 

     myThread = new Thread() 
     { 
      public void run() 
      { 
          Thread.sleep(3000); 
       System.out.println("My Thread."); 
      } 
     }; 

     myThread.setName("My Thread"); 
     myThread.start(); 

     if(!myThread.isAlive()) 
     { 
      myThread.setName("My Thread"); 
      myThread.start(); 
     } 

    } 

} 
+1

Verwenden Sie stattdessen Thread.getState(), es bietet zusätzliche Informationen. das zweimalige Starten eines Threads hat ebenfalls keine Wirkung. – bestsss

+0

Zum Ratschlag von @bestsss: Brian Goetz 'Buch, Java Concurrency in Practice, sagt: "Das Ergebnis von Thread.getState sollte nicht für die Steuerung des gemeinsamen Zugriffs verwendet werden und ist für den Test sehr begrenzt. Sein primäres Dienstprogramm dient als Debugging-Quelle Information." – WoodenKitty

+0

@WoodenKitty, während ein Thread nicht gestartet wurde, wäre getState() stabil (muss eventuell mit dem Threadstart synchronisiert werden). Goetz 'Rat ist sehr solide, aber in diesem Fall ist er nicht anwendbar. – bestsss

Antwort

3

Wenn mein Gedächtnis mir gut dient Java hat ziemlich lange Zeiträume zwischen Threadwechsel, so ist es möglich, dass die isAlive fehlschlägt, weil der Thread noch nicht lebt. Versuchen Sie etwas Wartezeit zwischen thread.start() und thread.isAlive() hinzuzufügen

+0

Ich habe versucht, Thread für 3 Sekunden schlafen zu lassen, aber das gleiche Problem zu bekommen. – Rise

+0

versuchen, den aufrufenden Thread für eine Sekunde schlafen zu lassen (_and_ lass das Kind Thread 3 Sekunden schlafen) – dbemerlin

+0

es hat perfekt funktioniert .. Vielen Dank. – Rise

10

Es gibt eine gute Chance, den Faden, ausgeführt und abgeschlossen, zwischen Ihrem Anruf start() und Ihr Anruf isAlive() wird begonnen.

Java bietet keine Garantien für die Reihenfolge, in der diese Dinge passieren. Es könnte den erzeugten Thread sofort ausführen, oder er könnte es bis zu einem späteren Zeitpunkt verschieben.

Übrigens versucht Ihr Code, den Thread neu zu starten, nachdem er gestorben ist. Dies ist not permitted:

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

So ruft start() nach Überprüfung isAlive() wird nie funktionieren.

+0

Aye ... Ich muss einen "synchronisierten" Block um mein Gehirn und meine Finger wickeln – skaffman

+1

Nein, ich habe es mit Thread.sleep (3000) versucht; rufe innerhalb der run-Methode auf. Trotzdem bekomme ich das gleiche Problem. – Rise

+0

Aber wie kommt es? Ich habe meinen Faden für 3 Sekunden schlafen gelegt. und dann den Aufruf von isAlive() überprüft. Und ich denke, in diesem Fall muss der Aufruf von isAlive() den Wert true zurückgeben, aber er gibt immer noch das wahre Ergebnis zurück. – Rise

1

Ich habe noch kein Multithreading in Java gemacht, aber es sieht für mich so aus, als ob Ihr Thread wahrscheinlich vor dem isAlive() - Check ausgeführt und beendet wurde. Schließlich sieht dein Thread nur etwas aus und stirbt dann.

1

Ich sehe nicht den Punkt des Codes, den Sie gepostet haben. Thread.start() startet den Thread: Sie müssen ihn nicht zweimal starten. Ich sehe nicht, wie Ihr Code realistisch in eine Situation kommen kann, in der er einen Thread hat und nicht weiß, ob er gestartet wurde oder nicht; Wie auch immer, es gibt viele Möglichkeiten, das zu codieren, damit es nicht passieren kann.

+1

Es geht nicht darum, den Code zu verwenden, wie es in einer realen Lebenssituation ist, sondern darum, die Konzepte klar zu machen. – Rise

+0

Aber alles was es bedeutet ist, dass der Thread nicht wirklich gestartet wurde, wenn start() zurückkehrt. Es ist asynchron, weißt du. Ich sehe nicht, welches Konzept dargestellt wird. – EJP