处理后台线程订阅的链。比称为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运算符的整个块?
此解决方案是否有任何副作用?
答案 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;。