2017-01-25 68 views
1

這是我的示例代碼RxJava:使用SubscribeOn使得程序退出沒有完成

Observable.range(1,5) 
      .subscribeOn(Schedulers.computation()) 
      .map(Observables05::doSomething) 
      .subscribe(System.out::println, Throwable::printStackTrace,() -> System.out.println("done")); 

我DoSomething的方法是,

public static int doSomething(int i) { 
    try { 
     System.out.println("Processing " + i + 
       " on Thread -- " + Thread.currentThread().getName()); 
     Thread.sleep(500); 
     return i; 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
     throw new RuntimeException(e); 
    } 
} 

僅使用我的主線程的代碼直接退出程序。但是,如果在此之後使用Thread.sleep(3000),那麼程序在睡眠時間結束時退出之前會正常工作。

這是預期的行爲,爲什麼?如何在不使用Thread.sleep的情況下運行此代碼?

回答

3

subscribeOn時間表subscribe調用後臺線程(您已選擇computation調度程序)。在此計劃之後,您的主線程可以自由運行,即終止您的程序。

不知何故,您需要等待所有理想的任務完成後才能退出。 Thread.sleep(3000)完成簡單測試用例的工作。

真正的程序通常不會終止那麼快。仍然有些情況下,您需要等待一些後臺任務才能完成。有各種線程同步機制(例如,CountDownLatch),您可以使用它。

+0

任何方式來實現這一點沒有'Thread.sleep'? – Dripto

0

如果要測試使用TestSubscriber編寫的代碼。

代碼應該是這樣的:

TestSubscriber<Integer> testSubscriber = new TestSubscriber<>(); 

Observable.range(1,5) 
     .subscribeOn(Schedulers.computation()) 
     .map(Observables05::doSomething) 
     .subscribe(testSubscriber); 

testSubscriber.awaitTerminalEvent(10, TimeUnit.SECONDS); 

記住TestSubscriber讓你測試不僅僅是終端的事件多了很多。

0

這是預期的行爲。如你在main方法執行爲你簡單的辦法就是使用toBlocking()您訂閱之前 - 如下 -

Observable.range(1,5) 
    .subscribeOn(Schedulers.computation()) 
    .map(DummyJunk::doSomething) 
    .toBlocking() 
    .subscribe(System.out::println, Throwable::printStackTrace,() -> System.out.println("done")); 
相關問題