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