我没有从文档中清楚地了解publishOn()
(或者在RxJava的情况下observeOn()
)运算符如何在线程亲和性方面工作。我认为这个运算符保证任何订阅者都将在同一个线程中处理,但以下示例已经破坏了我的理解:
Flux<String> started = ep.publishOn(scheduler);
Flux<String> afterStateUpdate = started.doOnNext(e -> {
System.out.println("STATE UPDATE : " + Thread.currentThread().getId());
state.add(e);
}).share();
afterStateUpdate.subscribe();
ep.onNext("1");
ep.onNext("2");
ep.onNext("3");
afterStateUpdate.subscribe(e -> {
System.out.println("MAIN SUBSCRIBER : " + Thread.currentThread().getId());
});
ep.onNext("4");
ep.onNext("5");
ep.onNext("6");
结果我看到以下输出:
STATE UPDATE : 12
STATE UPDATE : 12
STATE UPDATE : 12
STATE UPDATE : 13
MAIN SUBSCRIBER : 13
STATE UPDATE : 13
MAIN SUBSCRIBER : 13
STATE UPDATE : 13
MAIN SUBSCRIBER : 13
这意味着“状态更新程序”一直在线程12中工作,但是当第二个订阅者订阅“状态更新程序”时开始在第13个线程中工作。
所以,问题是在这种情况下我如何保证我的订户的线程亲和力?
答案 0 :(得分:0)
我发现只有一种方法可以100%确定一个订阅者使用相同的线程。要创建一个这样的单一调度程序池:
wrapIntoSingleThread(schedulers[i++ % schedulers.length]).subscribe(...)
然后为每个订阅者从此池中选择一个调度程序:sed 's/,/.csv/;s/$/.csv/' filemapping.dat | xargs -n2 mv
如果有人知道提供线程亲和力的其他方式 - 请更正我。