2010-06-29 93 views
5

我正在嘗試java線程的isAlive()方法的一個例子。但是我發現即使線程已經啓動,isAlive()方法也會返回false。有人可以告訴我我做錯了什麼?這是代碼片段。java線程的isAlive()方法無法正常工作?

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

改爲使用Thread.getState(),它提供了額外的信息。開始線程兩次也沒有效果。 – bestsss 2011-01-28 01:56:33

+0

關於@bestsss建議:Brian Goetz的書「實踐中的Java併發」說:「Thread.getState的結果不應該用於併發控制,並且對於測試的用處有限,它的主要用途是作爲調試的來源信息。」 – WoodenKitty 2016-07-01 00:21:33

+0

@WoodenKitty,雖然一個線程還沒有啓動getState()會很穩定(可能需要與線程啓動同步)。戈茨的建議非常穩固,但在這種情況下不適用。 – bestsss 2016-12-03 23:27:33

回答

3

如果我的內存爲我提供了很好的服務,java在線程切換之間有相當長的時間,所以有可能isAlive失敗,因爲線程是還沒有活着。嘗試在thread.start()和thread.isAlive()之間添加一些等待時間

+0

我嘗試讓線程睡眠3秒,但得到同樣的問題。 – Rise 2010-06-29 13:02:22

+0

嘗試使調用線程睡一秒鐘(_and_讓子線程睡3秒) – dbemerlin 2010-06-29 13:06:57

+0

它已完美運行..非常感謝。 – Rise 2010-06-29 13:28:01

10

有一個很好的機會,該線程將陸續開工,執行,完成,您的電話之間的start()和您的來電isAlive()

Java對這些事情發生的順序沒有提供任何保證。它可以立即執行產生的線程,或者可以選擇延遲它,直到稍後。

順便說一句,你的代碼試圖在線程死後重新啓動線程。這是not permitted

多次啓動線程 永遠不合法。特別是,一旦 完成執行, 線程可能無法重新啓動。

所以打電話start()檢查後isAlive()永遠不會工作。

+0

是啊......我需要在我的大腦和我的手指周圍包裹一個「同步」模塊 – skaffman 2010-06-29 12:53:14

+1

不,我嘗試使用Thread.sleep(3000);在run方法內部調用。我仍然遇到同樣的問題。 – Rise 2010-06-29 12:54:00

+0

但是怎麼回事?我讓我的線程睡了3秒。然後檢查isAlive()調用。我認爲在這種情況下,isAlive()調用必須返回true,但它仍然返回true結果。 – Rise 2010-06-29 13:00:06

1

我還沒有在java中做過任何多線程,但是在我看來,像你的線程可能會在isAlive()檢查之前運行並退出。畢竟,看起來你的線程只是印出一些東西然後死掉。

1

我沒有看到您發佈的代碼點。 Thread.start()啓動線程:你不需要啓動它兩次。我沒有看到你的代碼如何能夠真實地轉化爲它具有線程並且不知道它是否已經啓動的情況;無論如何,有很多方法來編碼,所以它不會發生。

+1

這不是關於如何在現實生活中使用代碼,而是爲了使概念清晰。 – Rise 2010-07-01 13:57:20

+0

但是,它意味着線程在start()返回時並沒有真正開始。你知道這是異步的。我不明白正在說明什麼概念。 – EJP 2010-08-21 13:20:11