मैं आरएक्स ऑपरेटरों के साथ खिलवाड़ कर रहा हूं और उत्सुक हूं कि क्यों 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)