2015-05-16 13 views
5

मैं दो धागे एक के बाद एक चलाना चाहते हैं, सो() या ताले का उपयोग किए बिना, लेकिन एक गतिरोध होता है! मेरे कोड में क्या गलत है? मैंने प्रतीक्षा() और NOTifyAll() और ऑब्जेक्ट ऑब्जेक्ट का उपयोग किया।जावा इंतजार और सूचित करता है गतिरोध

public class Test { 

    public static void main(String[] args) throws InterruptedException { 
     PrintChar a = new PrintChar('a'); 
     PrintChar b = new PrintChar('b'); 
     Thread ta = new Thread(a); 
     Thread tb = new Thread(b); 
     ta.start(); 
     tb.start(); 
    } 
} 

class PrintChar implements Runnable { 
    final Object o = new Object(); 
    char ch; 
    public PrintChar(char a) { 
     ch = a; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < 100; i++) { 
      synchronized (o) { 
       System.out.print(ch); 
       try { 
        o.wait(); 
        o.notifyAll(); 
       } catch (InterruptedException ex) { 
       } 
      } 
     } 
    } 
} 
+2

मैं इन सवालों को समझने कभी नहीं। यदि आप अनुक्रमिक निष्पादन चाहते हैं, तो आप धागे का उपयोग क्यों कर रहे हैं? – EJP

+0

ईजेपी को कभी भी ध्यान न दें! बस अभ्यास! – John

उत्तर

7

अपने कोड चल रहा है, और इसे देख, मैं पाया है कि प्रत्येक थ्रेड आप उत्पन्न पैदा किया गया था और अपने आप ही वस्तु के लिए सिंक्रनाइज़ किया जा रहा है, इसलिए उन्हें एक दूसरे को अधिसूचित करने से रोकता है। मैंने यह भी पाया है कि आप अधिसूचित होने से पहले प्रतीक्षा करें, इसलिए आपको कभी भी o.notifyAll() का आह्वान नहीं करना है, क्योंकि o.wait() इसे पहले बंद कर देता है।

बदलें final Object o = new Object()static final Object o = new Object() के लिए, और स्विच o.wait() के स्थानों और o.notifyAll()

-1

मैं synchronized ब्लॉक गतिरोध खड़ी कर रहा है लगता है। क्योंकि यह दूसरे धागे को चालू होने तक शुरू नहीं करेगा। वर्तमान थ्रेड प्रतीक्षा करने के लिए आप wait() विधि का उपयोग कर रहे हैं। ठीक है, यह इंतजार करेंगे लेकिन जब से यह synchronized ब्लॉक में है, यह वर्तमान धागा में हो जाएगा हमेशा के लिए किसी अन्य धागा कभी नहीं अस्तित्व की वजह से synchronized में आया है।

एक बात आप अन्य धागा काम Thread.stop उपयोग कर रहा है बनाने के लिए कर सकते हैं। वर्तमान धागे के संदर्भ में stop method पर कॉल करने का प्रयास करें। लेकिन मुझे यकीन नहीं है कि यह मौजूदा धागे को फिर से शुरू करने देगा।

+0

लेकिन निश्चित रूप से यह आपके प्रश्न के अनुसार अन्य धागा शुरू करेगा ** नींद() ** :) – Choxx

+2

यह गलत है, क्योंकि 'ऑब्जेक्ट.वाइट()' का आधा कार्य परमाणु रूप से उस लॉक को जारी करना है। वास्तव में प्रश्न में ऑब्जेक्ट पर 'सिंक्रनाइज़ किए गए' ब्लॉक के भीतर से कॉल किया जाना आवश्यक है। – Dolda2000

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