配置在背景线程上订阅的链

时间:2018-04-17 12:35:25

标签: java multithreading rx-java2 thread-sleep

处理后台线程订阅的链。比称为shutdown()的方法shutdownNow()ExecutorService。线程中断的标志设置为 true

Rx操作员内部判断中断信号的标志是否被忽略?当调用dispose时,只禁用对下游的emmision?在catch块中将标志再次设置为 true 是一个不错的选择吗?

我尝试将其用于测试目的:

Completable.fromAction(() -> {
  log("section before sleep");
  try {
    Thread.sleep(5000);
  } catch(InterruptedException e) {
    Thread.currentThread().interrupt();
  }
  log("section after sleep");
})
.subscribeOn(Schedulers.io())
.subscribe();

我在睡眠期间处理链并在调用睡眠后使用"部分记录" 仍然打印。 我知道这个具有本机线程睡眠的代码并不清楚。但我想避免切换线程(延迟),这是过度的。内部逻辑不应该被破坏,因为链使用自己的线程(使用IoSchedulder)。

调用dispose之后仍称为fromAction运算符的整个块?

此解决方案是否有任何副作用?

1 个答案:

答案 0 :(得分:0)

感谢@elnino纠正我。当取消来自与订阅线程不同的线程时, io 调度程序将中断线程。

关于你的代码,睡眠后的"部分"即使线程被中断,也会始终打印日志行。试试这个:

Completable.fromAction(() -> {
  log("section before sleep");
  try {
    Thread.sleep(5000);
  } catch(InterruptedException e) {
    log("interrupted");
  }
  log("section after sleep");
})
.subscribeOn(Schedulers.io())
.subscribe();

如果处理中断了线程,那么您应该看到"中断"和睡眠后的#34;。