/ / ऑब्जर्वेबल के अजीब व्यवहार # प्रतिक्रियात्मक एक्सटेंशन में दोहराएं - जावा, आरएक्स-जावा, रिएक्टिव-प्रोग्रामिंग, रिपीट, नमूनाकरण

अवलोकन के अजीब व्यवहार # प्रतिक्रियाशील एक्सटेंशन में दोहराएं - जावा, आरएक्स-जावा, प्रतिक्रियाशील-प्रोग्रामिंग, दोहराना, नमूनाकरण

मैं आरएक्स ऑपरेटरों के साथ खिलवाड़ कर रहा हूं और उत्सुक हूं कि क्यों just(null).repeat() किसी भी निर्मित ऑपरेटर में पैरामीटर के रूप में काम नहीं करता है:

Observable.interval(1, TimeUnit.SECONDS)
.sample(Observable.just(null).repeat())
.subscribe(System.out::println);

मुझे उम्मीद है कि यह प्रिंट होगा 0 1 2 3 ... लेकिन यह सिर्फ लटका हुआ है। मैं इसकी कल्पना करता हूं क्योंकि repeat डिफ़ॉल्ट को हॉगिंग है Schedulerहालाँकि, यदि आप की भूमिकाओं को स्वैप करते हैं interval और यह just-repeat तब यह उम्मीद के मुताबिक काम करता है, छपाई null प्रति सेकंड एक बार:

Observable.just(null).repeat()
.sample(Observable.interval(1, TimeUnit.SECONDS))
.subscribe(System.out::println);

यहाँ क्या चल रहा है?

उत्तर:

जवाब के लिए 3 № 1

यदि आप एक अनुसूचक को निर्दिष्ट नहीं करते हैं (और कोई ऑपरेटर एक सेट नहीं कर रहा है), तो सभी प्रसंस्करण एक ही थ्रेड पर होता है। just(null).repeat() एक सीपीयू कोर के 100% को हॉग करेगा, इसलिए और कुछ भी आगे बढ़ने का मौका नहीं मिलता है।

आपके मामले में, interval पर उत्पादन किया जाता है Scedulers.computation() शेड्यूलर, और क्योंकि यह शुरुआत में है और कोई शेड्यूलर परिवर्तन बाद में नहीं होता है, आपका repeat भी उसी धागे पर काम कर रहा है।

दूसरे मामले में, सब कुछ एक ही धागे पर सब्सक्राइब हो जाता है, अंतराल को छोड़कर, जो अपने स्वयं के अनुसूचक पर है; बाकी के आंतरिक कार्यान्वयन पर निर्भर करता है sample.

यदि आप एक विशिष्ट अनुसूचक का उपयोग करते हैं, तो यह काम करना चाहिए:

.sample(Observable.just(null).repeat().subscribeOn(Schedulers.computation()))

ध्यान दें कि यदि आप संख्याओं के बजाय केवल नल का उपयोग करना चाहते हैं interval का उपयोग करता है, एक बहुत अधिक कुशल तरीका है map के बजाय sample:

.map(any -> (Object) null)