"हाय, अमिगो!"
"आणि आणखी काही तपशील. चला याला व्यावहारिक सल्ला म्हणूया."
"समजा तुमच्याकडे अशी पद्धत आहे जी एखाद्या गोष्टीची वाट पाहत आहे आणि परिस्थिती पूर्ण होईपर्यंत झोपी जाते."
public synchronized Runnable getJob()
{
if (jobs.size() == 0)
this.wait();
return jobs.remove(0);
}
"जावा दस्तऐवजीकरण अत्यंत आग्रहाने प्रतीक्षा पद्धतीला लूपमध्ये कॉल करण्याची शिफारस करते:"
public synchronized Runnable getJob()
{
while (jobs.size() == 0)
this.wait();
return jobs.remove(0);
}
"का? गोष्ट अशी आहे की जर धागा जागा झाला तर त्याचा अर्थ स्थिती समाधानी आहे असे नाही. कदाचित असे वीस झोपलेले धागे असतील. ते सर्व जागे झाले, पण एकच कार्य हाती घेता येईल."
"ढोबळमानाने सांगायचे तर, 'खोटे अलार्म' असू शकतात. एका चांगल्या विकसकाने हे लक्षात घेतले पाहिजे."
"मी बघतो. सूचना वापरणे सोपे नाही का?"
"ठीक आहे, जर सूचीमध्ये एकापेक्षा जास्त कार्ये असतील तर काय? सूचना सहसा ऑप्टिमायझेशनच्या फायद्यासाठी वापरण्याची शिफारस केली जाते. इतर सर्व प्रकरणांमध्ये, notifyAll पद्धत वापरण्याची शिफारस केली जाते."
"ठीक आहे."
"परंतु आणखी बरेच काही आहे. प्रथम, अशी परिस्थिती असू शकते जिथे कोणीतरी तुमचा वर्ग वारसा घेतो, त्यांच्या स्वतःच्या पद्धती जोडतो आणि प्रतीक्षा/सूचना सर्व देखील वापरतो. दुसऱ्या शब्दांत, अशी परिस्थिती असू शकते जिथे स्वतंत्र प्रतीक्षा/सूचना सर्व जोड्या एकाच ऑब्जेक्टवर थांबतात. आणि एकमेकांबद्दल माहिती नाही. मग तुम्ही काय करावे?"
"नेहमी लूपमध्ये प्रतीक्षा करा आणि लूपची समाप्ती स्थिती सत्य आहे का ते तपासा!"
"बरोबर. आणि तुम्ही यातून सुटू शकत नाही हे अगदी स्पष्ट करण्यासाठी, बरेच विकासक असे दर्शवतात की काहीवेळा थ्रेड्स स्वतःच जागे होतात. असे धागे जे चुकूनही जागृत होणार नाहीत याची हमी दिली जाते. हा कोड ऑप्टिमायझेशनचा दुष्परिणाम असल्याचे दिसते. Java मशीन चालू आहे."
"अरे. समजले. लूपशिवाय, प्रतीक्षा पद्धत चांगली नाही."
GO TO FULL VERSION