2011-05-06 17 views
5

Bana bunun bu şekilde başlatılıp başlatılmadığını bir iş parçacığı durumunu elde etmek hala mümkün mü benim iplikBir iş parçacığının durumu nasıl alınır?

public class Countdown implements Runnable{ 

    public Countdown(){ 
     new Thread(this).start(); 
    } 

    //... 
} 

tanımlamak nasıl?

cevap

5

Hayır. Bu değildir.

Eğer durumu elde edebilmek istiyorsanız, Thread'e bir referans tutmak zorundasınız; Örneğin. Countdown nesneye referans örn çünkü yapımı sırasında bir istisna (kesilirse

  • : bu büyük bir modeli değil neden

    arada
    public class Countdown implements Runnable{ 
        private final Thread t; 
    
        public Countdown(){ 
         t = new Thread(this); 
         t.start(); 
        } 
    
        public Thread.State getState() { 
         return t.getState(); 
        } 
        // ... 
    } 
    

    , başka nedenler vardır Üst nesnenin), bir iş parçacığı sızdıracaksınız.

  • Konu ve iş parçacığı oluşturma çok fazla kaynak tüketir. Bu Countdown nesnenin bir sürü varsa veya kısa bir ömürleri varsa, bir iş parçacığı havuzu kullanmak daha iyi olur.

+1

public class Countdown implements Runnable{ volatile Object thread = State.NEW; public void run(){ this.thread = Thread.currentThread(); try{ ///.... }finally{ this.thread = State.TERMINATED; } } State getState(){ Object t=this.thread; return t instanceof State?((State)t):((Thread)t).getState(); } 

}. ;) –

3

sadece senin durumunu almak için sağlayıcıya bir sarıcı yöntemi olacak Runnable uygulayan olduğundan beri Sen

public class Countdown implements Runnable{ 
    private final Thread thread; 
    public Countdown(){ 
     (thread = new Thread(this)).start(); 
    } 

    public Thread.State getState() { 
     return thread.getState(); 
    } 
} 
2

yapabilirsiniz: söylemek

class Countdown implements Runnable { 
    private final Thread thread; 

    public Countdown() { 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public Thread.State getState() { 
     return thread.getState(); 
    } 
} 
+0

Harika akıllar ... –

+0

İki çizgiyi birleştirdiğini görüyorum, daha önce bu durumda kullanmayı düşünmemiştim. – WhiteFang34

1

Maalesef yapmalısın asla kurucudan bir iş parçacığı başlatmayın. Bu kurucu problemler için yalvarıyor. Geri Sayımın başlatıcısı iş parçacığı oluşturmak için değiştirin.

+0

Kurucuda bir iş parçacığı başlatmak her zaman mutlaka kötü olduğunu düşünmüyorum. Bununla ilgili dikkatli olmalısınız, kurucunun sonunda başlattığınızdan emin olun. Kötü bir uygulama olabileceğine dair referans için bkz. Http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html – WhiteFang34

+1

Ayrıca bir iş parçacığı oluşturmamanız için başka nedenler de vardır. Bir kurucuda ve özellikle OP'nin yayınladığı kodla. Sınıf uygulanmakta ve kendini bir Runnable olarak açığa vurmaktadır. Bu, diğer geliştiricilere iş parçacığını başlatmaları/oluşturmaları gerektiğini belirtir. Birisi, yayınlanan kodu alt sınıflara ayırırsa sorun yaşayabilir. – Kaj

1

run() yöntemini kullanmanızı ve c-tor içinde hayır iş parçacığını atamanızı öneririm. Çizgiler boyunca bir şey. Ben Konu `final` yapacak

İlgili konular