2012-02-14 14 views
5

यह मेरे लिए वास्तव में अजीब है, लेकिन मेरे प्रोग्राम में सभी()/सूचित() विफल होने की तरह दिखता है। कोड बल्कि जटिल है, मूल रूप से मैं तीन धागे ए, बी है, सीजावा - सूचित करें सभी() और सूचित करें() विफल? क्या यह संभव है?

एक अनुरोध भेजता बी और एक 10 सेकेंड का समय समाप्त के साथ अनुरोध पर इंतजार() के लिए, जब बी खत्म, यह सूचित कॉल() को जगाने के लिए अप ए

सी एक डेडलोप में सी एक कतार के माध्यम से ए के लिए कई तारों को खिलाता है, ए उन्हें उठाता है और प्रिंट करता है। प्रत्येक बार जब एक स्ट्रिंग प्रिंट करता है तो यह बी के लिए अनुरोध भेजता है और प्रतीक्षा करता है।

तो कार्यप्रवाह होने के लिए आता है:

सी deadloop में एक खिला रहता

  1. एक सी से स्ट्रिंग बाहर प्रिंट
  2. एक अनुरोध भेजता बी और इंतजार (10)
  3. को बी सूचित करें() ......

  4. सी से स्ट्रिंग आउट प्रिंट करता है .... बार-बार ....

यह पहले कुछ सेकंड में काम करता है। हालांकि, थोड़ी देर के बाद मैं देखता हूं कि जब बी प्रिंट करता है कि उसने सूचित किया है() ए, ए अभी भी इंतजार कर रहा है क्योंकि कतार जो सी को फ़ीड करने के लिए उपयोग करती है, जल्दी से बढ़ रही है, और कोई स्ट्रिंग ए द्वारा मुद्रित नहीं होती है। अंत में, 10 सेकेंड के बाद , ए अनुरोध समय समाप्ति शिकायत करता है।

ऐसा लगता है कि अधिसूचना() विफल रही है क्योंकि बी को सूचित करने के बाद संदेश मुद्रित किया गया है()। प्रतीक्षा/उद्धरण जावा की कट्टरपंथी विशेषता है, मुझे विश्वास नहीं है कि यह असफल हो जाएगा। क्या यह संभव है?

+8

क्या आप * निश्चित * ए "अभी भी प्रतीक्षा कर रहे हैं"? दूसरी संभावना यह है कि * * अधिसूचना * के बाद * प्रतीक्षा * शुरू हुई, जो टूटा कोड होगा। (आपको पहले से कुछ ऐसा करने की प्रतीक्षा नहीं करनी चाहिए।) –

+0

शायद बी ने कॉल करने से पहले अधिसूचित किया है –

+1

हम कोड चाहते हैं। – vulkanino

उत्तर

2

सूचित करें() केवल तभी काम करेगा जब उस समय थ्रेड प्रतीक्षा() आईएनजी हो।

आपके द्वारा उपयोग किए जाने वाले मुहावरे को सिंक्रनाइज़ किए गए ब्लॉक में एक राज्य को सूचित करना()/notifyAll() के रूप में बदलना है। प्रतीक्षा ब्लॉक में, आप बार-बार राज्य परिवर्तन की जांच करते हैं। इस तरह अगर अधिसूचना बहुत जल्दी शुरू हो गई तो इसे रिकॉर्ड करने के लिए एक राज्य परिवर्तन है। अगर प्रतीक्षा बहुत ही बढ़ती है तो राज्य फिर से नहीं बदला जाता है तो यह फिर से इंतजार करेगा।

public synchronized void notifyReady() { 
    ready = true; 
    notifyAll(); 
} 

public synchronized void waitForReady() throws InterruptedException { 
    while(!ready) 
     wait(); 
} 
+0

धन्यवाद दोस्तों को प्राप्त करूंगा। समय का मुद्दा साबित हुआ है –

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