我有一个应该在新线程中逐个处理的任务列表,然后结果应该通过某个主线程显示在方法中。
但是,这似乎不起作用,在主线程中调用flatMap
方法。
为什么subscribeOn
方法在这种情况下不处理“线程切换”?
在另一个线程中执行某些工作会有什么更好的模式? (除了使用Observable.create
并手动创建新线程,这非常详细)
List<Task> tasks = ...;
Observable.from(tasks)
.flatMap(task -> {
// should be handled in a new thread
try {
return Observable.just(task.call());
} catch (Exception e) {
log.error("Error", e);
}
return Observable.empty();
})
.subscribeOn(Schedulers.newThread())
.observeOn(MySchedulers.main())
.subscribe(this::show); // subscribe called from main thread
答案 0 :(得分:3)
警告:我不是Java程序员,而是C#,因此所有奇怪的驼峰案例方法名称都让我感到困惑并使我感到困惑。
如果您想要subscribeOn
操作的新线程,flatMap
位置错误。将其插入from
和flatMap
之间。有关subscribeOn
和observeOn
的完整说明,请参阅this answer - 它是为.NET编写的,但原则是相同的。
我不熟悉Java中的任务,所以我不确定您的Task
是否像.NET Task
以及task.call()
是异步的并且启动它自己的线程 - 我想你的问题并不是因为你说的是......在 a 新线程中应该逐个处理的任务列表&#34;
newThread
调度程序使用每个订阅者的新线程 - 由于flatMap
将进行单个订阅,所有task.call
调用都将在同一个线程上进行,虽然这将来自from
运营商的主题。
如果task.call
实际上是异步的,那么结果将根据它引入并发性而返回,并且它将独立于Rx的语义。
无论哪种方式,(正确放置)observeOn
都会导致结果传递到主线程上的this::show
。