การติดตั้งเพิ่มด้วย Rxjava Schedulers.newThread () เทียบกับ Schedulers.io ()


84

สิ่งที่เป็นประโยชน์ต่อการใช้Schedulers.newThread()VS Schedulers.io()ในRetrofitคำขอของเครือข่าย ฉันได้เห็นตัวอย่างมากมายที่ใช้io()แต่ฉันต้องการเข้าใจว่าทำไม

ตัวอย่างสถานการณ์:

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())...

เทียบกับ

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())...

หนึ่งในเหตุผลที่ฉันเห็นคือ -

newThread()สร้างเธรดใหม่สำหรับแต่ละหน่วยงาน io()จะใช้เธรดพูล

แต่อะไรคืออิทธิพลของข้อโต้แย้งที่มีต่อแอป แล้วมีแง่มุมอะไรอีกบ้าง?

คำตอบ:


99

คุณเข้าใจถูกแล้วว่าประโยชน์ของการใช้นั้นSchedulers.io()อยู่ที่การใช้เธรดพูลในขณะที่Schedulers.newThread()ไม่มี

เหตุผลหลักที่คุณควรพิจารณาใช้เธรดพูลคือพวกเขารักษาเธรดที่สร้างไว้ล่วงหน้าจำนวนหนึ่งซึ่งไม่ได้ใช้งานและรอการทำงาน ซึ่งหมายความว่าเมื่อคุณมีงานที่ต้องทำคุณไม่จำเป็นต้องใช้ค่าใช้จ่ายในการสร้างเธรด เมื่องานของคุณเสร็จแล้วคุณยังสามารถใช้เธรดนั้นซ้ำสำหรับการทำงานในอนาคตได้แทนที่จะสร้างและทำลายเธรดอย่างต่อเนื่อง

เธรดอาจมีราคาแพงในการสร้างดังนั้นการลดจำนวนเธรดที่คุณกำลังสร้างขึ้นทันทีจึงเป็นเรื่องที่ดี

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเธรดพูลฉันขอแนะนำ:


4
อาจคุ้มค่าที่จะเพิ่มความคิดเห็นเกี่ยวกับ Scheduler.io () โดยอิงจากเธรดพูลที่ไม่ถูกผูกไว้ซึ่งอาจไม่เหมาะสมสำหรับการใช้งานบางกรณี ดูstackoverflow.com/questions/31276164/…
Dave Moten

@DaveMoten กรณีการใช้งานใดที่ไม่เหมาะสมสำหรับเธรดพูลผ่านSchedulers.io?
IgorGanapolsky

3
หากคุณมีงานที่ต้องทำพร้อมกันจำนวนมากSchedulers.io()คุณอาจชนกับขีด จำกัด OS i / o (เช่นจำนวนไฟล์ที่เปิดสูงสุดจำนวนการเชื่อมต่อ tcp สูงสุดซึ่งเพื่อความน่าเชื่อถืออาจยังคงเปิดอยู่ในช่วงเวลาหนึ่งแม้ว่าจะถูกกำจัดไปแล้วก็ตาม) . เธรดใหม่แต่ละชุดยังต้องการ RAM ขั้นต่ำที่ไม่สำคัญ (> 512K แต่ใช้งานได้กับ 1M) เพื่อให้คุณใช้ RAM หมด
Dave Moten

เธรดเหล่านั้นใช้หน่วยความจำเดียวกันหรือไม่ เช่นอ็อบเจ็กต์ที่สร้างขึ้นในเธรด io หนึ่งเธรดและถูกเข้าถึงในเธรด io อื่น
Eido95

1
@ Eido95 พวกเขาแชร์กองเดียวกันไม่ใช่กองเดียวกัน เท่าที่ตัวแปรไปใช่คุณสามารถแชร์ตัวแปรระหว่างเธรดได้ (พร้อมคำเตือนทั่วไปทั้งหมดเกี่ยวกับการตรวจสอบให้แน่ใจว่าตัวแปรเหล่านั้นปลอดภัยสำหรับเธรด)
Bryan Herbst
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.