运算符“publishOn()”和Reactor项目中的线程关联

时间:2017-04-05 09:19:29

标签: java multithreading rx-java reactive-programming project-reactor

我没有从文档中清楚地了解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个线程中工作。

所以,问题是在这种情况下我如何保证我的订户的线程亲和力?

1 个答案:

答案 0 :(得分:0)

我发现只有一种方法可以100%确定一个订阅者使用相同的线程。要创建一个这样的单一调度程序池:

wrapIntoSingleThread(schedulers[i++ % schedulers.length]).subscribe(...)

然后为每个订阅者从此池中选择一个调度程序:sed 's/,/.csv/;s/$/.csv/' filemapping.dat | xargs -n2 mv

如果有人知道提供线程亲和力的其他方式 - 请更正我。