RxJava(四)interval操作符是否會阻塞計算執行緒
阿新 • • 發佈:2020-12-03
interval不會阻塞計算執行緒
interval操作符預設使用計算執行緒組。因為我的機器是8核CPU,所以計算執行緒數總共是8個。現在我要建立9個觀察者,9-8=1,那麼必然有兩個觀察者會在同一個計算執行緒中處理。
如下面程式碼:
public class Example1_4 {
public static void main(String args[]) { Observable<Long> oable = Observable.interval(1, TimeUnit.SECONDS); Action1<Long> a2 = t -> System.out.println(Thread.currentThread().getName()+" A2: "+t); Action1<Long> a3 = t -> System.out.println(Thread.currentThread().getName()+" A3: "+t); Action1<Long> a4 = t -> System.out.println(Thread.currentThread().getName()+" A4: "+t); Action1<Long> a5 = t -> System.out.println(Thread.currentThread().getName()+" A5: "+t); Action1<Long> a6 = t -> System.out.println(Thread.currentThread().getName()+" A6: "+t); Action1<Long> a7 = t -> System.out.println(Thread.currentThread().getName()+" A7: "+t); Action1<Long> a8 = t -> System.out.println(Thread.currentThread().getName()+" A8: "+t); Action1<Long> a9 = t -> System.out.println(Thread.currentThread().getName()+" A9: "+t); Action1<Long> a1 = new Action1<Long>() { @Override public void call(Long t) { System.out.println(Thread.currentThread().getName()+" A1: "+t); if (t == 0) { oable.subscribe(a2); oable.subscribe(a3); oable.subscribe(a4); oable.subscribe(a5); oable.subscribe(a6); oable.subscribe(a7); oable.subscribe(a8); oable.subscribe(a9); } } }; oable.subscribe(a1); try { Thread.sleep(10*1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
輸出的結果是
RxComputationThreadPool-1 A1: 0 RxComputationThreadPool-1 A1: 1 RxComputationThreadPool-2 A2: 0 RxComputationThreadPool-6 A6: 0 RxComputationThreadPool-3 A3: 0 RxComputationThreadPool-4 A4: 0 RxComputationThreadPool-5 A5: 0 RxComputationThreadPool-1 A9: 0 RxComputationThreadPool-7 A7: 0 RxComputationThreadPool-8 A8: 0 RxComputationThreadPool-1 A1: 2 RxComputationThreadPool-2 A2: 1 RxComputationThreadPool-3 A3: 1 RxComputationThreadPool-4 A4: 1 RxComputationThreadPool-5 A5: 1 RxComputationThreadPool-8 A8: 1 RxComputationThreadPool-1 A9: 1 RxComputationThreadPool-7 A7: 1 RxComputationThreadPool-6 A6: 1 RxComputationThreadPool-1 A1: 3 RxComputationThreadPool-2 A2: 2 RxComputationThreadPool-3 A3: 2 RxComputationThreadPool-7 A7: 2 RxComputationThreadPool-6 A6: 2 RxComputationThreadPool-5 A5: 2 RxComputationThreadPool-4 A4: 2 RxComputationThreadPool-1 A9: 2 RxComputationThreadPool-8 A8: 2 RxComputationThreadPool-1 A1: 4 RxComputationThreadPool-2 A2: 3 RxComputationThreadPool-3 A3: 3 RxComputationThreadPool-5 A5: 3 RxComputationThreadPool-4 A4: 3 RxComputationThreadPool-7 A7: 3 RxComputationThreadPool-1 A9: 3 RxComputationThreadPool-6 A6: 3 RxComputationThreadPool-8 A8: 3 RxComputationThreadPool-1 A1: 5 RxComputationThreadPool-2 A2: 4 RxComputationThreadPool-3 A3: 4 RxComputationThreadPool-5 A5: 4 RxComputationThreadPool-4 A4: 4 RxComputationThreadPool-6 A6: 4 RxComputationThreadPool-7 A7: 4 RxComputationThreadPool-8 A8: 4 RxComputationThreadPool-1 A9: 4 RxComputationThreadPool-1 A1: 6 RxComputationThreadPool-2 A2: 5 RxComputationThreadPool-3 A3: 5 RxComputationThreadPool-5 A5: 5 RxComputationThreadPool-4 A4: 5 RxComputationThreadPool-7 A7: 5 RxComputationThreadPool-6 A6: 5 RxComputationThreadPool-1 A9: 5 RxComputationThreadPool-8 A8: 5 RxComputationThreadPool-1 A1: 7 RxComputationThreadPool-2 A2: 6 RxComputationThreadPool-3 A3: 6 RxComputationThreadPool-4 A4: 6 RxComputationThreadPool-5 A5: 6 RxComputationThreadPool-7 A7: 6 RxComputationThreadPool-1 A9: 6 RxComputationThreadPool-6 A6: 6 RxComputationThreadPool-8 A8: 6 RxComputationThreadPool-1 A1: 8 RxComputationThreadPool-2 A2: 7 RxComputationThreadPool-3 A3: 7 RxComputationThreadPool-4 A4: 7 RxComputationThreadPool-5 A5: 7 RxComputationThreadPool-7 A7: 7 RxComputationThreadPool-6 A6: 7 RxComputationThreadPool-8 A8: 7 RxComputationThreadPool-1 A9: 7 RxComputationThreadPool-1 A1: 9
觀察結果,可以發現RxComputationThreadPool-1裡執行了觀察者分別是A9和A1,進而推理出定時器的實現應該不是用Thread.sleep實現的,而是使用了某種不需要阻塞執行緒的方式比如紅黑樹等。