Trang bị thêm với Rxjava Schedulers.newThread () so với Schedulers.io ()


84

Là những lợi ích cho sử dụng những gì Schedulers.newThread()vs Schedulers.io()trong Retrofityêu cầu mạng. Tôi đã thấy nhiều ví dụ sử dụng io(), nhưng tôi muốn hiểu tại sao.

Tình huống ví dụ:

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

vs

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

Một trong những lý do tôi thấy là -

newThread()tạo một luồng mới cho mỗi đơn vị công việc. io()sẽ sử dụng một nhóm chủ đề

Nhưng ảnh hưởng của lập luận đó đối với ứng dụng là gì? Và có những khía cạnh nào khác?

Câu trả lời:


99

Bạn nói đúng rằng lợi ích của việc sử dụng Schedulers.io()nằm ở chỗ nó sử dụng một nhóm luồng, trong khi Schedulers.newThread()thì không.

Lý do chính mà bạn nên xem xét sử dụng nhóm luồng là chúng duy trì một số luồng được tạo trước đang ở chế độ nhàn rỗi và chờ hoạt động. Điều này có nghĩa là khi bạn có công việc phải hoàn thành, bạn không cần phải thực hiện toàn bộ chi phí của việc tạo một luồng. Khi công việc của bạn hoàn thành, luồng đó cũng có thể được sử dụng lại cho công việc sau này thay vì liên tục tạo và hủy các luồng.

Các chủ đề có thể tốn kém để tạo, vì vậy giảm thiểu số lượng các chủ đề mà bạn đang tạo một cách nhanh chóng nói chung là tốt.

Để biết thêm thông tin về nhóm chủ đề, tôi khuyên bạn nên:


4
Có thể đáng để thêm một nhận xét về Scheduler.io () dựa trên một nhóm luồng không bị ràng buộc, điều này có thể không thích hợp cho một số trường hợp sử dụng. Xem stackoverflow.com/questions/31276164/…
Dave Moten

@DaveMoten Những trường hợp sử dụng nào không phù hợp với nhóm luồng qua Schedulers.io?
IgorGanapolsky

3
Nếu bạn có nhiều công việc đồng thời phải làm Schedulers.io()thì bạn có thể gặp phải giới hạn i / o của hệ điều hành (ví dụ: số lượng tệp đang mở tối đa, số lượng kết nối tcp tối đa cho mục đích tin cậy có thể vẫn mở trong một khoảng thời gian ngay cả khi đã được xử lý) . Mỗi luồng mới cũng yêu cầu một số lượng RAM tối thiểu không nhỏ (> 512K nhưng hoạt động trên 1M) để bạn có thể hết RAM.
Dave Moten

Các chủ đề đó có cùng một bộ nhớ không? ví dụ: đối tượng được tạo trong một luồng io và được truy cập trong luồng io khác.
Eido95

1
@ Eido95 họ chia sẻ cùng một đống, không cùng một ngăn xếp. Đối với các biến, có, bạn có thể chia sẻ các biến giữa các luồng (với tất cả các cảnh báo điển hình về việc đảm bảo các biến đó là an toàn cho luồng).
Bryan Herbst
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.