मेरे पास एक थ्रेड है जो समय-समय पर इसकी स्थिति अपडेट करता है और मैं चाहता हूं कि दूसरा थ्रेड पहले थ्रेड के लिए इंतजार कर सके। कुछ इस तरह:जावा में किसी ईवेंट की प्रतीक्षा करना - यह कितना मुश्किल है?
Thread 1:
while(true) {
...do something...
foo.notifyAll()
...wait for some condition that might never happen...
...
}
Thread 2:
...
foo.wait();
...
अब इस अच्छा लग रहा है और सभी जब तक थ्रेड 1 के notifyAll() धागा 2 के इंतजार(), से पहले चलाता है जो मामले थ्रेड में जब तक 2 प्रतीक्षा करता थ्रेड 1 अधिसूचित फिर (कभी नहीं हो सकता है) ।
मेरे संभव समाधान:
एक) मैं एक CountDownLatch या एक भविष्य इस्तेमाल कर सकते हैं, लेकिन दोनों समस्या यह है कि वे स्वाभाविक केवल एक बारचलाने की है। यही है, थ्रेड 1 के दौरान लूप में, मुझे प्रत्येक बार प्रतीक्षा करने के लिए एक नया फू बनाने की आवश्यकता होगी और थ्रेड 2 को यह पूछने की आवश्यकता होगी कि किस फू का इंतजार है। के रूप में मुझे डर है कि foo = नए FutureTask() में, क्या होता है जब किसी को, के लिए "किसी कारण" (वर्ष foo के लिए इंतजार कर रहे थे सेट आमंत्रित नहीं किया गया मैं बस
while(true) {
foo = new FutureTask();
...
foo.set(...);
...wait for a condition that might never be set...
...
}
लिखने के बारे में बुरा विचार है, जैसे एक अपवाद हैंडलिंग में बग)?
ख) या मैं एक सेमाफोर इस्तेमाल कर सकते हैं:
class Event {
Semaphore sem;
Event() { sem = new Semaphore(1); sem . }
void signal() { sem.release(); }
void reset() { sem.acquire(1); }
void wait() { if (sem.tryAcquire(1)) { sem.release(); } }
}
लेकिन मुझे डर है, कुछ रेस स्थिति है कि वहाँ एक से अधिक थ्रेड प्रतीक्षा() इसके लिए ing कर रहे हैं, जबकि एक अन्य एक संकेत() और रीसेट () रों।
प्रश्न:
वहाँ जावा एपीआई कि Windows ईवेंट व्यवहार जैसा दिखता में कुछ भी नहीं है? या, यदि आप विंडोज़ को तुच्छ मानते हैं, तो गोलांग के वेट ग्रुप जैसे कुछ (यानी एक काउंटरडाउनलैच जो countUp() को अनुमति देता है)? कुछ भी?
मैन्युअल रूप से ऐसा करने के लिए:
थ्रेड 2 बस नकली Wakeup की वजह से इंतजार नहीं कर सकता और जावा में कोई रास्ता नहीं है पता करने के लिए क्यों Object.wait() लौट आए है। तो मुझे एक शर्त चर की आवश्यकता है जो स्टोर करता है कि घटना संकेतित है या नहीं। थ्रेड 2:
synchronized(foo) {
while(!condition) {
foo.wait();
}
}
और पाठ्यक्रम का थ्रेड 1 सिंक्रनाइज़ किए गए ब्लॉक में सही स्थिति को सेट करता है। संकेत के लिए सप्ताहांत के लिए धन्यवाद!
क्या कोई मौजूदा वर्ग है जो उस व्यवहार को लपेटता है?
या मुझे कोड को कॉपी और पेस्ट करने की आवश्यकता है?
क्या समस्या आप वास्तव में हल करने की कोशिश कर रहे हैं? जबकि मुझे यकीन है कि इस समस्या को हल किया जा सकता है, मैं अभी भी पूछना चाहूंगा ताकि हम जानते हैं कि यह आपकी समस्या का सही समाधान है। अच्छी तरह से समझने के दौरान धागे और सेमफोरों के साथ इस प्रकार की गड़बड़ी छोटी गलतियों के कारण असफलताओं के लिए प्रवण होती है, इसलिए आप जो हासिल करना चाहते हैं उसे करने के लिए एक और अधिक पढ़ने योग्य, समझने में आसान तरीका हो सकता है। विशेष रूप से यह एक साधारण Evenlistener पैटर्न की तरह लगता है जहां श्रोताओं घटनाओं के स्रोत के साथ रजिस्टर अधिक उपयुक्त होगा। – Thor84no
हां, एक ईवेंट श्रोता थ्रेड 1 "पुश" अपडेट देकर समस्या का समाधान करेगा। यह आमतौर पर पसंदीदा विधि है, उदा। एक सर्वर वातावरण में। हालांकि, मैं समय-समय पर अपडेट के लिए थ्रेड-सुरक्षित "खींचने" की समस्या में भाग गया और अब तक मेरा कोई साफ समाधान नहीं था। – Kosta