2014-05-04 2 views
6

मैं जावा concurrency/बहु थ्रेडिंग के लिए नया हूँ। क्या कोई मुझे बता सकता है कि किस परिस्थितियों में अधिग्रहण() और अधिग्रहण (अनन्य रूप से)() का उपयोग किया जाना चाहिए (या नहीं होना चाहिए), वे अलग कैसे हैं; और उनका उपयोग कैसे करें (कोड नमूना?)।java.util.concurrent का उपयोग कब करें। सैमफोर का अधिग्रहण() और अधिग्रहण अनन्य रूप से() विधि?

बहुत बहुत धन्यवाद।

+1

अधिग्रहण() बाधित है (मुझे लगता है कि आपको क्या मतलब है) और दूसरा नहीं है। यदि आप अधिग्रहण को रोकने के लिए कोई बाधा नहीं चाहते हैं() बाद में उपयोग करें, यदि आप कोड इंटरप्ट को संभाल सकते हैं, तो पूर्व का उपयोग करें। –

+0

पीटर, आपने कहा "... यदि आप अधिग्रहण को रोकने के लिए बाधा नहीं चाहते हैं() बाद में उपयोग करें .."। तो, क्या थ्रेड स्वयं ही बाधित हो जाएगा जब थ्रेड स्वयं ही बाधित हो जाएगा? – appFormation

+0

सेमफोर किसी भी मामले में उपयोगी है। बाधा बस कोड लेता है पथ बदलता है। –

उत्तर

0

प्रति प्रलेखन के रूप में:

दोनों ही तरीकों से सेमाफोर से परमिट प्राप्त कर लेता है और जब तक अवरुद्ध उपलब्ध है। लेकिन अधिग्रहण() विधि बाधित हो जाती है जिसका अर्थ है कि यह तब तक अवरुद्ध हो रहा है जब तक थ्रेड इंटरप्ट नहीं हो जाता है और यह बाधित हो जाता है अपवादित अपवाद (जिसे एक चेक किया जाता है)।

लेकिन अधिग्रहण अनियंत्रित रूप से() तब प्रभावित नहीं होता है जब थ्रेड बाधित हो जाता है, यह तब तक ब्लॉक स्थिति को बनाए रखता है जब तक इसे सेमफोर से परमिट प्राप्त न हो जाए।

स्रोत: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquireUninterruptibly()

1

acquire() व्यवधान कारक है। इसका मतलब है कि अगर एक धागा एक एक सेमाफोर पर acquire() बुला रहा है, और धागा interrupt() फोन करके धागे एक व्यवधान है, तो एक InterruptedException धागा ए

पर फेंक दिया जाएगा दूसरी ओर acquireUninterruptibly() पर व्यवधान कारक नहीं है। इसका मतलब है कि अगर कोई थ्रेड ए सेफोरोर पर acquireUninterruptibly() पर कॉल कर रहा है, और थ्रेड बी interrupt() पर कॉल करके थ्रेड ए को इंटरप्ट करता है, तो InterruptedException को थ्रेड ए पर फेंक दिया जाएगा, केवल उस थ्रेड ए को acquireUninterruptibly() रिटर्न के बाद इसकी बाधित स्थिति सेट होगी।

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