1. 程式人生 > 實用技巧 >RxJava(四)interval操作符是否會阻塞計算執行緒

RxJava(四)interval操作符是否會阻塞計算執行緒

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實現的,而是使用了某種不需要阻塞執行緒的方式比如紅黑樹等。