IO线程签出/释放策略RXJAVA
我使用的是IO线程签出/释放策略RXJAVA,java,multithreading,observable,rx-java,Java,Multithreading,Observable,Rx Java,我使用的是rxjava1.3.8,为了演示这个问题,我修改了IO调度器CacheThreadScheduler来记录这样的语句:当线程工作者从队列中取出时获取带$id的线程,当线程工作者返回队列时释放带$id的线程 现在考虑一个场景,我们想做一个异步IO HTTP调用,然后使用它的结果,再做一个异步的IO-HTTP调用。 下面的代码演示了这一点 在本例中,我们使用executor服务模拟异步io HTTP调用 1. Observable.just("1") 2. .doOnNe
rxjava1.3.8
,为了演示这个问题,我修改了IO调度器CacheThreadScheduler
来记录这样的语句:当线程工作者从队列中取出时获取带$id的线程
,当线程工作者返回队列时释放带$id的线程
现在考虑一个场景,我们想做一个异步IO HTTP调用,然后使用它的结果,再做一个异步的IO-HTTP调用。
下面的代码演示了这一点
在本例中,我们使用executor服务模拟异步io HTTP调用
1. Observable.just("1")
2. .doOnNext(s -> print("just started"))
3. .flatMap(one -> {
4. return Observable.create(sub -> {
5. // simulating an async io http request which take 10 sec
6. Executors.newSingleThreadExecutor().submit(() -> {
7. sleep(10_000);
8. print("GOT RESPONSE-1");
9. sub.onNext("");sub.onCompleted();
10. });
11. });
12. })
13. .doOnNext((s) -> print("before moving to io thread"))
14. .observeOn(Schedulers.io())
15. .doOnNext((s) -> print("after moving to io thread"))
16. .flatMap(two -> {
17. return Observable.create(sub -> {
18. Executors.newSingleThreadExecutor().submit(() -> {
19. // simulating an async io http request which take 10 sec
20. sleep(10_000);
21. print("GOT RESPONSE-2");
22. sub.onNext("");sub.onCompleted();
23. });
24. });
25. })
26. .doOnNext((s) -> print("close to end of chain"))
27. .subscribe();
获得的输出:
1. getting thread worker with id ThreadWorker@1d251891
2. main:just started
3. pool-1-thread-1:GOT RESPONSE-1
4. pool-1-thread-1:before moving to io thread
5. RxCachedThreadScheduler-1:after moving to io thread
6. pool-2-thread-1:GOT RESPONSE-2
7. pool-2-thread-1:close to end of chain
8. releasing thread worker with id ThreadWorker@1d251891 in 2011
现在,如果我们分析输出,它所做的第一件事就是从CacheThreadScheduler中签出一个线程工作线程,这是不可取的,因为我们希望在打印Get RESPONSE-1
之后应该签出线程工作线程
问题1:是否可以强制threadworker只有在打印了Get RESPONSE-1
后才能结账
第二件要看的事情是第8行
,threadworker将在管道完成后释放,预计threadworker应在Executors.newSingleThreadExecutor().submit
获得调用后尽快获得释放
问题2:在调用Executors.newSingleThreadExecutor().submit
后,是否可以强制释放threadworker