1

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

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

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

4

2 回答 2

1

一种可能的方法是使用sorts 的阻塞队列。父级将定期pollpeek在队列中接收新消息(穿插在它所做的任何事情中,比如监听事件等)

“子”线程将简单地将add其消息发送到队列,假设父线程及时删除它们。

我在这里假设父线程和子线程必须并行运行,即父线程在子线程到达新消息之前阻塞是不可行的:无论如何,在这种情况下拥有一个单独的子线程有什么意义。

使用阻塞队列可以确保即使子进程生成消息的速度比父进程消耗消息的速度快,内存使用量仍然是有限的,并且子进程必须在某个时间点等待,直到父进程最终设法腾出空间再次排队。

另一种方法是在父级无法足够快地使用它们时开始丢弃消息。

于 2012-06-05T08:57:34.877 回答
1

如果您在 Swing 中使用它,那么您应该使用SwingWorker(Java 的一部分)。有一个关于如何在后台工作时发布中期结果的示例。

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

于 2012-06-05T15:52:11.807 回答