java - Wrapping an asynchronous computation into a synchronous (blocking) computation -


समान प्रश्न:

मेरे पास एक ऐसी विधि है जिसमें मैं पुस्तकालय ग्राहकों (विशेष रूप से स्क्रिप्टिंग क्लाइंट) को कुछ जैसा दिखाना चाहूंगा:

  इंटरफ़ेस MyNiceInterface {public Baz doSomethingAndBlock (Foo fooArg, Bar barArg); सार्वजनिक भविष्य & lt; Baz & gt; DoSomething (फु फूआर्ग, बार बारआर्ग); // doSomethingAndBlock सरल तरीका है; // do कुछ भी अधिक नियंत्रण है, लेकिन // एक भविष्य के साथ सौदों और वह // स्क्रिप्टिंग क्लाइंट के लिए बहुत परेशानी हो सकती है)  

लेकिन मेरे पास उपलब्ध "आदिम" सामग्री का एक सेट है इवेंट-संचालित क्लासेस:

  इंटरफ़ेस बेस कॉम्पुटेशन सिंक {बज़ रेज़ल्ट पर सार्वजनिक शून्य (बाज़ परिणाम); } क्लास को लागू करना {सार्वजनिक शून्य doSomethingAsync (Foo fooArg, बार बारआर्ग, Bazcomputation सिंक सिंक); }  

जहां implementingThing इनपुट लेता है, कुछ कड़ी चीजें जो एक कार्य कतार में चीजों को एन्क्यूएंग करती है, और तब बाद में जब कोई परिणाम होता है, sink.onBazResult () हो जाता है एक थ्रेड पर बुलाया जाता है जिसे एक ही थ्रेड को लागू किया जा सकता है या जैसा कि ImplementingThing.doSomethingAsync () को बुलाया गया था।

क्या कोई ऐसा तरीका है जो मेरे पास घटना-चालित फ़ंक्शंस का उपयोग कर सकता है, साथ में संगामी प्राथमिकताएं MyNiceInterface को कार्यान्वित करें ताकि स्क्रीप्टिंग क्लाइंट एक अवरुद्ध धागा पर खुशी से प्रतीक्षा कर सकते हैं?

संपादित करें: क्या मैं इसका उपयोग कर सकता हूं?

अपने भविष्य के कार्यान्वयन का उपयोग करना:

  सार्वजनिक वर्ग BazComputationFuture लागू करता है भविष्य & lt; Baz & gt ;, BazComputationSink {निजी वाष्पशील बाज़ परिणाम = शून्य; निजी वाष्पशील बूलियन रद्द = गलत; निजी अंतिम गिनतीडाउनलोडलॉगडाउनलाच; सार्वजनिक बेज़ कॉम्पूप्शन फ्यूचर () {countDownLatch = नया गणना लॉग (1); } @ ओवरराइड पब्लिक बूलियन रद्द करें (अंतिम बूलियन मई इंटरप्ट इफ्रेंसिंग) {if (isDone ()) {return false; } और {countDownLatch.countDown (); रद्द = सच; वापसी! है (); }} @ ओवरराइड सार्वजनिक बाज़ मिल () फेंकता बाधित; एक्सक्शंस, एक्जिक्यूटेशन अपेशन {countDownLatch.await (); वापसी परिणाम; } @ ओवरराइड सार्वजनिक बाज़ प्राप्त करें (अंतिम लंबे समय समाप्ति, अंतिम टाइम यूनिट इकाई) में बाधा उत्पन्न करता है, अपवाद, निष्पादन अपवाद, समय समाप्ति {countDownLatch.await (टाइमआउट, इकाई); वापसी परिणाम; } @ ओवरराइड पब्लिक बूलियन को रद्द कर दिया गया है () {वापसी रद्द; } @ ओवरराइड पब्लिक बूलियन isDone () {वापसी countDownLatch.getCount () == 0; } बज़ रेज़ल्ट पर सार्वजनिक शून्य (अंतिम बाज़ परिणाम) {this.result = परिणाम; countDownLatch.countDown (); }} सार्वजनिक भविष्य & lt; बाज़ & gt; DoSomething (फु फूअर्ज, बार बारआर्ट) {बेज़ कॉम्प्यूशन फ़्यूचर भविष्य = नया बेज़ कॉम्पुटेशन फ़्यूचर (); DoSomethingAsync (fooArg, barArg, भविष्य); भविष्य में वापसी; } सार्वजनिक बाज़ doSomethingAndBlock (Foo fooArg, बार बारआग्र) {वापसी doSomething (fooArg, barArg) .get (); }  

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


Comments

Popular posts from this blog

sql - dynamically varied number of conditions in the 'where' statement using LINQ -

asp.net mvc - Dynamically Generated Ajax.BeginForm -

Debug on symbian -