gpt4 book ai didi

java - 处置后台线程订阅的链

转载 作者:太空宇宙 更新时间:2023-11-04 10:32:13 26 4
gpt4 key购买 nike

在后台线程上订阅的链已被释放。然后调用 ExecutorServiceshutdown()shutdownNow() 方法。线程中断标志设置为true

中断信号标志是由 Rx 运算符(operator)在内部读取还是被忽略?当调用 dispose 时,仅禁用向下游的发射?在 catch block 中再次将标志设置为 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();

我在 sleep 期间处理链,并且仍然打印“调用 sleep 后的部分”的日志。我知道这段带有 native 线程 sleep 的代码不清楚。但我想避免切换线程(延迟),这是矫枉过正。内部逻辑不应该被破坏,因为链使用自己的线程(使用 IoSchedulder)。

调用 dispose 后仍然调用 fromAction 运算符的整个 block ?

这个解决方案有副作用吗?

最佳答案

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

关于您的代码,即使线程被中断,“ sleep 后的部分”日志行也将始终被打印。试试这个:

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

如果处理中断了线程,那么您应该看到“已中断”和“ sleep 后的部分”。

关于java - 处置后台线程订阅的链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49878303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com