在新线程上调度可以与父线程通信的任务

时间:2012-06-05 08:07:41

标签: java concurrency message-passing

我想在新线程上调度任务,我希望此任务在其执行的各个阶段通知父线程。如下所示:

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");
}

此用例的标准库解决方案是什么? (我想要外部依赖。)

2 个答案:

答案 0 :(得分:1)

一种可能的方法是使用blocking queue of sorts。父母将在队列中定期pollpeek以接收新消息(无论如何穿插其中所做的任何事情,例如,倾听事件等)。

“child”线程只是add它的消息到队列,假设父母及时删除它们。

我在这里假设,父线程和子线程必须并行运行,即,在新消息从子节点到达之前,父线程阻塞是不可行的:在该消息中有一个单独的子线程是什么意思无论如何。

使用阻塞队列确保即使子进程生成的消息比父进程消耗的速度快,内存使用仍然受限,并且子进程必须等待,直到父进程最终设置为再次腾出空间。

另一种方法是在父母不能足够快地消费它们时开始丢弃消息。

答案 1 :(得分:1)

如果你在Swing中使用它,那么你应该使用SwingWorker(Java的一部分)。在后台工作时how to publish interim results有一个例子。

如果您不使用Swing,则标准java附带Executors类。您可以创建单个线程ExecutorService并将Runnable提交给它。它不提供发布结果的方法,但您仍然可以像示例中显示的那样手动进行回调。