प्राप्त किए बिना सेमफोर रिलीज मेरे पास थ्रेड हैं जिन्हें यादृच्छिक संख्या (1 से n) दिया जाता है और उन्हें क्रमबद्ध क्रम में मुद्रित करने का निर्देश दिया जाता है। मैंने सेमफोर का उपयोग किया जैसे कि मैं परमिट की संख्या = यादृच्छिक संख्या प्राप्त करता हूं और अधिग्रहित किए गए एक से अधिक परमिट जारी करता हूं।जावा -
अधिग्रहण = यादृच्छिक संख्या; जारी = 1 + यादृच्छिक संख्या
सेमफोर के लिए प्रारंभिक परमिट गणना 1 है। तो यादृच्छिक संख्या 1 के साथ धागा परमिट प्राप्त करना चाहिए और फिर 2 और इसी तरह।
यह कोई आवश्यकता है कि एक धागा है कि एक परमिट जारी अधिग्रहण को फोन करके कि परमिट हासिल कर ली है चाहिए() नहीं है नीचे
दिया प्रलेखन के अनुसार समर्थित है।
समस्या यह है कि मेरा प्रोग्राम n> 2 के लिए 1 के बाद अटक गया है।
मेरे कार्यक्रम नीचे दिया गया है
import java.util.concurrent.Semaphore;
public class MultiThreading {
public static void main(String[] args) {
Semaphore sem = new Semaphore(1,false);
for(int i=5;i>=1;i--)
new MyThread(i, sem);
}
}
class MyThread implements Runnable {
int var;Semaphore sem;
public MyThread(int a, Semaphore s) {
var =a;sem=s;
new Thread(this).start();
}
@Override
public void run() {
System.out.println("Acquiring lock -- "+var);
try {
sem.acquire(var);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(var);
System.out.println("Releasing lock -- "+var);
sem.release(var+1);
}
}
आउटपुट है:
हासिल लॉक - 4
हासिल लॉक - 5
हासिल लॉक - 3
हासिल करना ताला - 2
लॉक प्राप्त करना - 1
लॉक जारी करना - 1
जबकि अगर मैं tryAququire के साथ अपना कोड संशोधित करता हूं, तो यह पूरी तरह से अच्छी तरह से चलता है। नीचे नई रन कार्यान्वयन है
@Override
public void run() {
boolean acquired = false;
while(!acquired) {
acquired = sem.tryAcquire(var);
}
System.out.println(var);
sem.release(var+1);
}
किसी सेमाफोर का परमिट प्राप्त तंत्र के बारे में समझाएं कर सकते हैं जब एकाधिक धागे अलग परमिट अनुरोध के साथ इंतजार कर रहे हैं ??
मैं माफी चाहता मैं अपने सवाल का जवाब नहीं कर सकते, लेकिन हूँ। ** ** ** नया थ्रेड (यह) .start(); 'कन्स्ट्रक्टर में करें।जैसा कि आप अभी भी कन्स्ट्रक्टर में हैं, ऑब्जेक्ट पूर्ण नहीं है और आप किसी अन्य विधि में आंशिक रूप से प्रारंभिक ऑब्जेक्ट देते हैं, इस मामले में भी एक और थ्रेड तक। यह वास्तव में वास्तव में बुरा है, ऐसा मत करो। 'रननेबल' लागू करने के बजाय बेहतर 'थ्रेड' बढ़ाएं और फिर 'नया MyThread (i, sem) .start();' या 'नया थ्रेड (नया MyThread (i, sem)) प्रारंभ करें(); '। – Vampire
ओह ठीक है, मैं इसे सत्यापित करूँगा। इस पर ध्यान दिलाने के लिए धन्यवाद। – user1474053
@ BjörnKautler सिर्फ यह कहने के बजाय "* यह वास्तव में बहुत बुरा है, ऐसा मत करो। *" व्याख्या करने की कोशिश करें * क्यों * ताकि लोग अंतर्निहित मुद्दे को समझ सकें। – dimo414