2010-06-29 60 views
5

Java iş parçacığının isAlive() yöntemini deniyordum. Ancak, iş parçacığı zaten başlatılmış olsa bile false'un isAlive() yöntemini döndürdüğünü buldum. Birisi bana neyi yanlış yaptığımı söyleyebilir mi? İşte kod pasajı.isAlive() yöntemi düzgün çalışmıyor?

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() yerine, ek bilgi sağlar. Bir iş parçacığının iki kez başlatılmasının da bir etkisi yoktur. – bestsss

+0

@bestsss'ın tavsiyesiyle ilgili olarak: Brian Goetz'in Practice'deki Java Concurrency adlı kitabında, "Thread.getState'in sonucu eşzamanlılık kontrolü için kullanılmamalıdır ve test için kullanışlılığı vardır. Birincil yardımcı program hata ayıklama kaynağıdır. bilgi." – WoodenKitty

+0

@WoodenKitty, bir iş parçacığı başlatılmamışken getState() sabit olacaktır (iş parçacığı başladığında bazı senk. Gerekebilir). Goetz'in tavsiyesi oldukça sağlam bir şey ancak bu durumda geçerli değil. – bestsss

cevap

3

Hafızam bana iyi hizmet veriyorsa, iş parçacığı arasında çok uzun süreler vardır, bu yüzden iş parçacığı henüz canlı olduğundan, isAlive başarısız olabilir. Thread.start() ve thread.isAlive()

+0

3 saniye boyunca iş parçacığı uykusu yapmayı denedim, ancak aynı sorunu yaşıyorum. – Rise

+0

Arama iş parçacığı için bir saniye uyumaya çalışın (_and_ çocuğa 3 saniye uyuyalım) – dbemerlin

+0

mükemmel çalıştı .. Çok teşekkürler. – Rise

10

iyi iplik start() için, başlamış idam ve çağrısı arasında, bitmiş olacak şans ve isAlive() için arama var.

Java, bu şeylerin gerçekleştiği sırada bir garanti vermez. Bu, ortaya çıkan ipliği hemen uygulayabilir veya daha sonraya kadar ertelemeyi seçebilir.

Bu arada, kodunuz, öldükten sonra iş parçacığı yeniden başlatmaya çalışıyor. Bu not permitted geçerli:

Bir iplik kereden fazla başlatmak için yasal asla. Özellikle, iş parçacığı, yürütmeyi tamamladıktan sonra yeniden başlatılamayabilir.

Yani isAlive() asla işe yarayacak kontrol ettikten sonra start() arayarak.

+0

Evet ... Beynim ve parmaklarımın etrafında bir "senkronize" bloğu sarmalıyım – skaffman

+1

Hayır, Thread.sleep (3000) kullanmayı denedim; run yöntemini çağır. Yine de aynı sorunu yaşıyorum. – Rise

+0

Ama nasıl oldu? ipliğimi 3 saniye boyunca uyudum. ve ardından isAlive() çağrısını kontrol ettik. Ve bence bu durumdaAlive() çağrısı doğru olmalı ama yine de gerçek sonucu döndürüyor. – Rise

1

Henüz java'da çok iş parçacığı yapmadım, ama iş parçacığımın muhtemelen isAlive() kontrolünden önce çalıştırılıp çıkması gibi görünüyor. Her şeyden önce, iş parçanıza sadece bir şeyler basıyor ve sonra ölüyor gibi görünüyor.

1

arasında bekleme süresini eklemeyi deneyin. Gönderdiğiniz kodun noktasını göremiyorum. Thread.start() iş parçacığı başlatır: iki kez başlatmanız gerekmez. Kodunuzun bir iş parçacığı olduğu ve başlatılıp başlatılmadığını bilmeyen bir duruma nasıl gerçekçi bir şekilde dönüştüğünü göremiyorum; Her neyse, orada kodlamak için pek çok yol var, bu yüzden olamaz.

+1

Bu kodun gerçek bir yaşamda olduğu gibi kullanılması değil, kavramları netleştirmekle ilgilidir. – Rise

+0

Ama bunun anlamı, start() döndüğünde iş parçacığının aslında başlatılmamış olmasıdır. Bildiğiniz zaman uyumsuz. Hangi kavramın resmedildiğini göremiyorum. – EJP