如何在异常完成工作事件时通知主线程?
How to notify mainthread when completing WorkEvent with exception?
我正在使用 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
无一例外地完成,它就可以很好地工作。但是当它异常完成时,我想通知主线程停止它向 WorkManager
.
提交更多的 WorkItems
我以为我可以引发一个 RunetimeException
来通知主线程,但是分析日志我发现在主线程完成所有 WorkItems
提交到 [= 的那一刻抛出了异常12=] 并调用 WorkManager
的 join
方法 - 这太晚了(在大多数情况下,WorkManager
必须完成 50.000 项)。
那么,当 workCompleted
中识别出异常时,我该如何中断我的主线程以阻止它向 WorkManager
提交更多项目?
那你需要一个"more direct"界面。
意思;您正在显示调用的代码:
WorkItem item = wm.startWork(work, WorkManager.INDEFINITE, new WorkListener()
包含指令的class需要一些"input"通道;例如,class List<Exception>
中可能有一个 "simple" 字段,您的工作项 添加 它们的例外。
创建这些工作项的 "main" class 应该定期检查该列表;并在发现异常时停止添加新的工作项。
当然,你必须让那个线程安全,并提供一个合理的架构。
我正在使用 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
无一例外地完成,它就可以很好地工作。但是当它异常完成时,我想通知主线程停止它向 WorkManager
.
我以为我可以引发一个 RunetimeException
来通知主线程,但是分析日志我发现在主线程完成所有 WorkItems
提交到 [= 的那一刻抛出了异常12=] 并调用 WorkManager
的 join
方法 - 这太晚了(在大多数情况下,WorkManager
必须完成 50.000 项)。
那么,当 workCompleted
中识别出异常时,我该如何中断我的主线程以阻止它向 WorkManager
提交更多项目?
那你需要一个"more direct"界面。
意思;您正在显示调用的代码:
WorkItem item = wm.startWork(work, WorkManager.INDEFINITE, new WorkListener()
包含指令的class需要一些"input"通道;例如,class List<Exception>
中可能有一个 "simple" 字段,您的工作项 添加 它们的例外。
创建这些工作项的 "main" class 应该定期检查该列表;并在发现异常时停止添加新的工作项。
当然,你必须让那个线程安全,并提供一个合理的架构。