2012-06-19 20 views
7

başka benzer sınıf içindeki Konu genişleten bir sınıf uygulanması gerekliliğini var. Mümkün mü?Java'da bir iş parçacığı içinde bir iş parçacığı çalıştırabilir miyim? Java'da

// The first layer is a Thread 
public class Consumer extends Thread { 

    // Variables initialized correctly in the Creator 
    private BufferManager BProducer = null; 

    static class Mutex extends Object {} 
    static private Mutex sharedMutex = null; 


    public Consumer() { 
     // Initialization of the thread 
     sharedMutex = new Mutex(); 

     BProducer = new BProducer(sharedMutex); 
     BProducer.start(); 
    } 


    public void run() { 

     int data = BProducer.getData(); 

     ///// .... other operations 
    } 


    ////// ...... some code 

    // Also the second layer is a Thread 
    private class BufferManager extends Thread { 

     Mutex sharedMutex; 
     int data; 

     public BufferManager(Mutex sM) { 
      sharedMutex = sM; 
     } 

     public int getData(Mutex sM) { 
      int tempdata; 
      synchronized(sharedMutex) { 
       tempdata = data; 
      } 
      return tempdata; 
     } 

     public void run() { 
      synchronized(sharedMutex) { 
       data = getDataFromSource(); 
      } 
      ///// .... other operations on the data 
     } 
    } 
} 

ikinci Konu İlk birinin içinde doğrudan uygulanır:

Yapmak ne çalışıyorum bir örneği aşağıdaki (basitleştirilmiş) pasajıdır. Ayrıca, çalışacak bir Mutex'in uygulanıp uygulanmayacağını bilmek isterim. Değilse, bunu yapmak için daha iyi (standart) bir yol var mı?

Önceden teşekkür ederiz.

+8

Bu Başlangıç ​​değildir. – mre

+3

..Nasıl emin olabilirsiniz? – BlackVegetable

+1

Tüm konular diğer konulara göre başlatılmış, başka seçeneğiniz yok. İş parçacıkları olabildiğince bağımsız çalışmak için. İlk İpliği oluşturan Big-Bang hariç –

cevap

18

Thread 'içinde' çalıştırmak yerine yan yana değildir.

Evet, diğer iki Thread ile yan yana çalışmak için başka bir Thread başlatabilirsiniz. (OS izin verdiği sürece) Nitekim olarak, herhangi Thread başka Thread başlatabilirsiniz.

+0

Teşekkür ederim @ nicholas.hauschild. Yani, içinde yazılan gerçek iş parçacığının davranışını değiştirmez. Paylaşılan Muteks size göre mi? BufferManager kilitliyse Tüketici engeller mi? – 2dvisio

+0

Sağladığınız kodun (“yeni BProducer (sharedMutex)') derlenmeyeceğinden emin değilim? ”Ama Mutex'inizin“ Producer ”ve“ Consumer ”ın doğru bir şekilde kilitlenmesine izin vereceğini düşünüyorum. –

+0

Ayrıntılar için cevabımı görün, ancak Mutex değişkenlerinin beyanlarının kesin olmasını öneriyorum. – user949300

5

Evet, bu çalışması gerekir ve paylaşılan Mutex bu kadar iş yapmalıdır. Paranoya dışında, garip "kaçan" sorunları önlemek için final muteks bildirimlerini yapardım. Örneğin.

final Mutex sharedMutex; 

Bir öneri: belki bu benim stilim, ama böyle kodu için nadiren Thread uzanır. Bunun yerine Runnable'u uygulayın. IMO biraz daha az kafa karıştırıcı (burada YMMV). Eğer Executor gibi gelişmiş eşzamanlılık yardımcı programlarını kullanmaya başladığınızda Artı, bunlar Runnables değil konu ile uğraşmak.

+0

+1 Runnables' hakkında mükemmel bir nokta. Java.util.concurrent' sınıflarının 'Thread' işlevini kullanmadan 'Thread' havuzu oluşturmasına izin vermek zor olurdu. –

+0

Cevabınızı daha yeni gördüm. Runnable'ı uygulayarak, Runnables'in yuvalanması da işe yarayabilir mi? – 2dvisio

İlgili konular