कंपेटिबलफ्यूचर, फ्यूचर और आरएक्सजेवा के ऑब्जर्वेबल के बीच अंतर


193

मैं और CompletableFuture, के बीच का अंतर जानना चाहूंगा ।FutureObservable RxJava

मुझे पता है कि सभी अतुल्यकालिक हैं लेकिन

Future.get() धागे को अवरुद्ध करता है

CompletableFuture कॉलबैक विधियाँ देता है

RxJava Observable--- CompletableFutureअन्य लाभों के समान (सुनिश्चित नहीं)

उदाहरण के लिए: यदि क्लाइंट को कई सेवा कॉल करने की आवश्यकता होती है और जब हम उपयोग करते हैं Futures(जावा) Future.get()को क्रमिक रूप से निष्पादित किया जाएगा ... तो यह जानना चाहेंगे कि RxJava में इसका उपयोग कैसे बेहतर है ..

और प्रलेखन http://reactivex.io/intro.html कहता है

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

वास्तव में RxJavaयह जानने में दिलचस्पी है कि यह समस्या कैसे हल करती है। मुझे प्रलेखन से समझना मुश्किल था।


क्या आपने प्रत्येक के लिए प्रलेखन पढ़ा है? मैं RxJava से पूरी तरह से अपरिचित हूं, लेकिन प्रलेखन एक नज़र में पूरी तरह से दिखाई देता है। यह दो वायदा के लिए विशेष रूप से तुलनीय नहीं लगता है।
एफटीहोमसन

मैं गया है, लेकिन कैसे जावा वायदा से अलग नहीं कर पा रहा हूँ ... मुझे सही अगर im गलत
shiv455 3

वेधशालाएँ वायदा के समान कैसे होती हैं?
3

2
जानना चाहेंगे कि यह कहां अलग है जैसे कि थ्रेड मैनेजमेंट में यह अलग है ?? EX: Future.get () थ्रेड को ब्लॉक करता है .... इसे ऑब्जर्वेबल में कैसे संभाला जाएगा ???
shiv455

2
कम से कम मेरे लिए थोड़ा भ्रामक ... एक उच्च स्तर का अंतर वास्तव में उपयोगी होगा !!
shiv455

जवाबों:


278

फ्यूचर्स

वायदा जावा 5 (2004) में पेश किया गया था। वे मूल रूप से एक ऑपरेशन के परिणाम के लिए प्लेसहोल्डर हैं जो अभी तक समाप्त नहीं हुए हैं। एक बार ऑपरेशन खत्म हो जाने के बाद, Futureउस परिणाम को शामिल किया जाएगा। उदाहरण के लिए, एक ऑपरेशन एक हो सकता है Runnable या प्रतिदेय उदाहरण है कि एक को प्रस्तुत ExecutorService । ऑपरेशन का प्रस्तुतकर्ता यह Futureजांचने के लिए ऑब्जेक्ट का उपयोग कर सकता है कि क्या ऑपरेशनडॉन () है , या ब्लॉकिंग () विधि का उपयोग करके इसे समाप्त करने के लिए प्रतीक्षा करें ।

उदाहरण:

/**
* A task that sleeps for a second, then returns 1
**/
public static class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        Thread.sleep(1000);
        return 1;
    }

}

public static void main(String[] args) throws Exception{
    ExecutorService exec = Executors.newSingleThreadExecutor();
    Future<Integer> f = exec.submit(new MyCallable());

    System.out.println(f.isDone()); //False

    System.out.println(f.get()); //Waits until the task is done, then prints 1
}

CompletableFutures

कंप्लीटटेबलफुटर्स को जावा 8 (2014) में पेश किया गया था। वे वास्तव में नियमित फ्यूचर्स का एक विकास हैं, जो Google के सुनने योग्य फ्यूचर्स से प्रेरित हैं , जो कि अमरूद पुस्तकालय का हिस्सा है । वे फ्यूचर्स हैं जो आपको एक श्रृंखला में एक साथ कार्य करने की अनुमति देते हैं। आप "कुछ कार्य X करने के लिए कुछ कार्यकर्ता थ्रेड को बताने के लिए उनका उपयोग कर सकते हैं, और जब आप कर रहे हों, तो X के परिणाम का उपयोग करके यह अन्य कार्य करें"। कंप्लीटेबलफुटर्स का उपयोग करके, आप वास्तव में परिणाम की प्रतीक्षा करने के लिए एक थ्रेड को अवरुद्ध किए बिना ऑपरेशन के परिणाम के साथ कुछ कर सकते हैं। यहाँ एक सरल उदाहरण दिया गया है:

/**
* A supplier that sleeps for a second, and then returns one
**/
public static class MySupplier implements Supplier<Integer> {

    @Override
    public Integer get() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            //Do nothing
        }
        return 1;
    }
}

/**
* A (pure) function that adds one to a given Integer
**/
public static class PlusOne implements Function<Integer, Integer> {

    @Override
    public Integer apply(Integer x) {
        return x + 1;
    }
}

public static void main(String[] args) throws Exception {
    ExecutorService exec = Executors.newSingleThreadExecutor();
    CompletableFuture<Integer> f = CompletableFuture.supplyAsync(new MySupplier(), exec);
    System.out.println(f.isDone()); // False
    CompletableFuture<Integer> f2 = f.thenApply(new PlusOne());
    System.out.println(f2.get()); // Waits until the "calculation" is done, then prints 2
}

RxJava

नेटफ्लिक्स पर बनाई गई रिएक्टिव प्रोग्रामिंग के लिए RxJava पूरी लाइब्रेरी है । एक नज़र में, यह जावा 8 स्ट्रीम के समान प्रतीत होगा । यह है, सिवाय इसके कि यह बहुत अधिक शक्तिशाली है।

फ्यूचर्स के समान, एक प्रसंस्करण पाइपलाइन बनाने के लिए RxJava को सिंक्रोनस या एसिंक्रोनस क्रियाओं के एक समूह को एक साथ स्ट्रिंग करने के लिए इस्तेमाल किया जा सकता है। फ्यूचर्स के विपरीत, जो एकल-उपयोग वाले हैं, RxJava शून्य या अधिक वस्तुओं की धाराओं पर काम करता है । जिसमें अनंत संख्या में आइटम नहीं हैं। यह ऑपरेटरों के अविश्वसनीय रूप से समृद्ध सेट के लिए बहुत अधिक लचीला और शक्तिशाली धन्यवाद है ।

जावा 8 की धाराओं के विपरीत, RxJava भी एक है backpressure तंत्र है, जो यह मामले हैं जिनमें आपकी प्रसंस्करण पाइप लाइन के विभिन्न भागों अलग धागे में काम करते हैं, को संभालने के लिए अनुमति देता है अलग दरों पर

RxJava का नकारात्मक पक्ष यह है कि ठोस प्रलेखन के बावजूद, इसमें शामिल प्रतिमान के कारण सीखने के लिए एक चुनौतीपूर्ण पुस्तकालय है। Rx कोड डिबग करने का एक दुःस्वप्न भी हो सकता है, खासकर अगर कई थ्रेड्स शामिल हैं, और इससे भी बदतर - अगर बैकस्पेस की आवश्यकता है।

यदि आप इसे प्राप्त करना चाहते हैं, तो आधिकारिक वेबसाइट और आधिकारिक दस्तावेज़ और जावदोक पर विभिन्न ट्यूटोरियल का एक पूरा पृष्ठ है । आप इस तरह के कुछ वीडियो पर एक नज़र डाल सकते हैं जो आरएक्स में एक संक्षिप्त परिचय देता है और आरएक्स और फ़्यूचर्स के बीच के अंतर के बारे में भी बात करता है।

बोनस: जावा 9 रिएक्टिव स्ट्रीम

जावा 9 के रिएक्टिव स्ट्रीम्स उर्फ फ्लो एपीआई RxJava 2 , अक्का स्ट्रीम्स और वर्टेक्स जैसे विभिन्न प्रतिक्रियाशील स्ट्रीम लाइब्रेरी द्वारा कार्यान्वित इंटरफेसेस का एक सेट है । वे सभी महत्वपूर्ण पीठ-दबाव को संरक्षित करते हुए, इन प्रतिक्रियाशील पुस्तकालयों को आपस में जोड़ने की अनुमति देते हैं।


Rx यह कैसे करता है का उदाहरण कोड देना अच्छा होगा
ज़िनन ज़िंग

तो प्रतिक्रियाशील धाराओं का उपयोग करके, हम एक आवेदन में आरएक्सजाव, अक्का और वर्टेक्स को मिला सकते हैं?
इगोरगानापोलस्की

1
@IgorGanapolsky हाँ।
माल्ट

कंप्लीटेबलफुटर्स में हम कॉलबैक विधियों का उपयोग करते हैं, इन कॉलबैक विधियों को भी ब्लॉक कर देगा यदि एक विधि का आउटपुट अन्य कॉलबैक का इनपुट है। Future.get () कॉल के साथ भविष्य के ब्लॉक के रूप में। ऐसा क्यों कहा जाता है कि Future.get () कॉल को ब्लॉक कर रहा है जबकि कंप्लीटटेबल फ़्यूचर ब्लॉक नहीं होते हैं। कृपया समझाएं
दीपक

1
@ फ़ेडरिको ज़रूर। प्रत्येक एकल परिणाम के Futureलिए एक प्लेसहोल्डर है जो अभी तक पूरा हो सकता है या नहीं हो सकता है। यदि आप फिर से वही ऑपरेशन करते हैं, तो आपको एक नया उदाहरण मिलेगा । RxJava परिणामों की धाराओं से संबंधित है जो किसी भी समय आ सकते हैं। इसलिए ऑपरेशन की एक श्रृंखला एक एकल RxJava को वापस लौटा सकती है जो परिणामों का एक गुच्छा पंप करेगी। यह एक एकल डाक लिफाफे और एक वायवीय ट्यूब के बीच का अंतर जैसा है जो मेल को बाहर रखता है। Future
माल्ट

20

मैं 0.9 के बाद से Rx जावा के साथ काम कर रहा हूं, अब 1.3.2 पर और जल्द ही 2.x पर जा रहा हूं, मैं इसे एक निजी परियोजना में उपयोग करता हूं जहां मैं पहले से ही 8 वर्षों के लिए काम करता हूं।

मैं इस पुस्तकालय के बिना अब बिल्कुल भी कार्यक्रम नहीं करूंगा। शुरुआत में मुझे संदेह था लेकिन यह एक पूर्ण मन की दूसरी स्थिति है जिसे आपको बनाने की आवश्यकता है। शुरुआत में काफी मुश्किल। मैं कभी-कभी घंटों तक मार्बल्स को देख रहा था .. लोल

यह केवल अभ्यास की बात है और वास्तव में प्रवाह (पर्यवेक्षकों और पर्यवेक्षक के उर्फ ​​अनुबंध) को जानने के लिए, एक बार जब आप वहां पहुंचते हैं, तो आप इसे अन्यथा करने से नफरत करेंगे।

मेरे लिए वास्तव में उस पुस्तकालय पर नकारात्मक पक्ष नहीं है।

मामले का उपयोग करें: मेरे पास एक मॉनिटर दृश्य है जिसमें 9 गेज (सीपीयू, मेम, नेटवर्क, आदि ...) हैं। जब दृश्य शुरू होता है, तो दृश्य स्वयं को एक सिस्टम मॉनीटर वर्ग के लिए सब्सक्राइब करता है जो एक अवलोकन योग्य (अंतराल) देता है जिसमें 9 मीटर के लिए सभी डेटा होते हैं। यह प्रत्येक दूसरे दृश्य को एक नया परिणाम देगा (इसलिए मतदान नहीं !!!)। यह देखने योग्य एक साथ (async!) 9 अलग-अलग स्रोतों से डेटा प्राप्त करने के लिए एक फ्लैटमैप का उपयोग करता है और परिणाम को एक नए मॉडल में ज़िपित करता है जो आपके दृश्य को onNext () पर मिलेगा।

तुम कैसे करोगे कि वायदा, पूर्ण आदि के साथ ... अच्छा भाग्य! :)

आरएक्स जावा मेरे लिए प्रोग्रामिंग में कई मुद्दों को हल करता है और एक तरह से बहुत आसान बनाता है ...

लाभ:

  • मूर्तियाँ !!! (उल्लेख करने के लिए महत्वपूर्ण बात, सबसे महत्वपूर्ण शायद)
  • थ्रेड प्रबंधन बॉक्स से बाहर
  • ऐसे सीक्वेंस बनाएं, जिनका अपना जीवनचक्र हो
  • सब कुछ वेधशालाएं हैं, इसलिए जंजीर बनाना आसान है
  • लिखने के लिए कम कोड
  • क्लासपाथ पर एकल जार (बहुत हल्का)
  • अत्यधिक समवर्ती
  • अब कोई कॉलबैक नरक नहीं
  • सब्सक्राइबर आधारित (उपभोक्ता और निर्माता के बीच तंग अनुबंध)
  • बैकप्रेस की रणनीतियाँ (सर्किट ब्रेकर एक तरह)
  • शानदार त्रुटि से निपटने और पुनर्प्राप्त करना
  • बहुत अच्छा प्रलेखन (पत्थर <3)
  • पूर्ण नियंत्रण
  • बहुत सारी ...

नुकसान: - कठिन परिक्षण


13
~ " मैं अब इस लाइब्रेरी के बिना कोई कार्यक्रम नहीं करूंगा। "
इगोरगानापोलस्की

अगर मैं अतुल्यकालिक घटनाओं की धारा नहीं है तो भी यह उपयोगी है?
मुकेश वर्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.