2012-06-19 9 views
7

जावा में मैं एक वर्ग है कि एक और इसी तरह वर्ग के भीतर थ्रेड फैली को लागू करने की आवश्यकता है। क्या यह संभव है?क्या मैं जावा में धागे के भीतर धागा चला सकता हूं?

// 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 
     } 
    } 
} 

दूसरे थ्रेड सीधे पहले एक के अंदर कार्यान्वित किया जाता है:

मुझे क्या करना है कोशिश कर रहा हूँ का एक उदाहरण निम्नलिखित (सरलीकृत) टुकड़ा है। इसके अलावा मैं जानना चाहता हूं कि म्यूटेक्स को कार्यान्वित करना इस तरह काम करेगा या नहीं। यदि नहीं, तो ऐसा करने के लिए कोई बेहतर (मानक) तरीका है?

अग्रिम धन्यवाद।

+8

इस स्थापना के समय नहीं है। – mre

+3

.. आप निश्चित रूप से कैसे जान सकते हैं? – BlackVegetable

+1

सभी धागे अन्य धागे से शुरू होते हैं, आपके पास कोई विकल्प नहीं है। धागे स्वतंत्र रूप से यथासंभव काम करने के लिए हैं। –

उत्तर

18

Thread 'के भीतर' चलाया जाता है, बल्कि साथ-पक्ष।

तो हां, आप अपने अन्य दो Thread के साथ-साथ साइड-साइड चलाने के लिए एक और Thread शुरू कर सकते हैं। तथ्य की बात के रूप में, किसी भी Thread एक और Thread (इतने लंबे समय ओएस यह अनुमति देता है के रूप में) शुरू कर सकते हैं।

+0

धन्यवाद @ निकोलस.hauschild। तो, जो तथ्य लिखा गया है वह थ्रेड के व्यवहार को नहीं बदलता है। क्या आपके अनुसार साझा म्यूटेक्स है? क्या बफर मैनेजर ने इसे बंद कर दिया है तो क्या यह उपभोक्ता को अवरुद्ध करेगा? – 2dvisio

+0

खैर, मुझे यकीन नहीं है कि आपके द्वारा प्रदान किया गया कोड संकलित करेगा ('नया BProducer (sharedMutex)'?) लेकिन मुझे लगता है कि आपका 'म्यूटेक्स' आपके 'निर्माता' और 'उपभोक्ता' को ठीक से लॉक करने की अनुमति देगा। –

+0

विवरण के लिए मेरा उत्तर देखें, लेकिन मेरा सुझाव है कि म्यूटेक्स चर की घोषणा अंतिम होगी। – user949300

5

हाँ, यह काम करना चाहिए और साझा Mutex यह काम है क्या करना चाहिए। परावर्तक से बाहर, मैं किसी भी अजीब "भागने" मुद्दों से बचने के लिए म्यूटेक्स घोषणाएं final दोनों बनाना चाहता हूं। जैसे

final Mutex sharedMutex; 

एक सुझाव: शायद यह मेरी शैली है, लेकिन इस तरह कोड के लिए मैं शायद ही कभी Thread का विस्तार। इसके बजाए बस Runnable लागू करें। आईएमओ यह थोड़ा कम भ्रमित है (यहां वाईएमएमवी)। साथ ही, जब आप Executor जैसे उन्नत संगामिति उपयोगिताओं का उपयोग शुरू, वे Runnables, नहीं धागे के साथ सौदा।

+0

+1 'रननेबल्स' के बारे में उत्कृष्ट बिंदु। 'Java.util.concurrent' कक्षाओं के लिए 'थ्रेड' पूलिंग को 'रननेबल' के उपयोग किए बिना अनुमति देना मुश्किल होगा। –

+0

मैंने अभी आपका जवाब देखा है। रननेबल को लागू करने का मतलब है कि रननेबल्स घोंसला भी काम कर सकता है? – 2dvisio

संबंधित मुद्दे