我正在使用IBM WorkManager (v8.0.0)来完成与主线程异步的工作。
为此,我使用以下代码:
// wm = via resource injected WorkManager
WorkItem item = wm.startWork(work, WorkManager.INDEFINITE, new WorkListener() {
@Override
public void workStarted(WorkEvent arg0) {
}
@Override
public void workRejected(WorkEvent arg0) {
}
@Override
public void workCompleted(WorkEvent arg0) {
WorkException exception = arg0.getException();
if (null != exception) {
throw new RuntimeException("WorkCompleted with Exception");
}
}
@Override
public void workAccepted(WorkEvent arg0) {
}
});
只要WorkEvent
完成而没有例外,这种方法就可以正常工作。但是当它以异常完成时,我想通知mainthread阻止它向WorkManager
提交更多WorkItems。
我以为我可以提出RunetimeException
来通知主线程,但是分析日志后我发现在主线程完成时将所有WorkItems
提交到WorkManager
时会抛出异常并调用join
的{{1}}方法 - 这已经太晚了(在大多数情况下,WorkManager
必须完成50.000项。)
那么,如果在WorkManager
中识别出异常,我怎样才能中断我的主线程以阻止它向WorkManager
提交更多项目?
答案 0 :(得分:1)
然后你需要一个“更直接”的界面。
含义;您正在显示调用的代码:
WorkItem item = wm.startWork(work, WorkManager.INDEFINITE, new WorkListener()
包含该指令的类需要一些“输入”通道;例如,该类List<Exception>
中可能有一个“简单”字段,您的工作项添加其例外。
创建这些工作项的“主”类应定期检查该列表;并在发现异常时停止添加新工作项。
当然,您必须使该线程安全,并提供合理的架构。