我想在新线程上调度任务,我希望此任务在其执行的各个阶段通知父线程。如下所示:
void unzip(Path source, Path destination, ObserverThread observer) {
int n = compute number of entries;
observer.notify("n: " + n);
while (there are more entries) {
observer.notify("Unzipping " + name of entry);
unzip the entry;
}
observer.notify("done");
}
此用例的标准库解决方案是什么? (我想要外部依赖。)
答案 0 :(得分:1)
一种可能的方法是使用blocking queue of sorts。父母将在队列中定期poll
或peek
以接收新消息(无论如何穿插其中所做的任何事情,例如,倾听事件等)。
“child”线程只是add
它的消息到队列,假设父母及时删除它们。
我在这里假设,父线程和子线程必须并行运行,即,在新消息从子节点到达之前,父线程阻塞是不可行的:在该消息中有一个单独的子线程是什么意思无论如何。
使用阻塞队列确保即使子进程生成的消息比父进程消耗的速度快,内存使用仍然受限,并且子进程必须等待,直到父进程最终设置为再次腾出空间。
另一种方法是在父母不能足够快地消费它们时开始丢弃消息。
答案 1 :(得分:1)
如果你在Swing中使用它,那么你应该使用SwingWorker(Java的一部分)。在后台工作时how to publish interim results有一个例子。
如果您不使用Swing,则标准java附带Executors类。您可以创建单个线程ExecutorService并将Runnable提交给它。它不提供发布结果的方法,但您仍然可以像示例中显示的那样手动进行回调。