【发布时间】:2012-07-24 21:38:06
【问题描述】:
我有一个应用程序,它处理存储在来自输入目录的多个文件中的数据,然后根据该数据生成一些输出。
到目前为止,应用程序是按顺序工作的,即它启动一个“管理器”线程,该线程
- 将输入目录的内容读入
File[]数组 - 按顺序处理每个文件并存储结果
- 处理完所有文件后终止
我想把它转换成一个多线程应用程序,其中的“管理器”线程
- 将输入目录的内容读入
File[]数组 - 启动多个“处理器”线程,每个线程处理单个文件、存储结果并将该文件的摘要报告返回给“管理器”线程
- 在处理完所有文件后终止
“处理器”线程的数量最多等于文件的数量,因为它们将通过ThreadPoolExecutor 回收。
任何避免使用join() 或wait()/notify() 的解决方案都是可取的。
基于以上场景:
- 让那些“处理器”线程向“管理器”线程报告的最佳方式是什么?基于
Callable和Future的实现在这里有意义吗? - “管理器”线程如何知道所有“处理器”线程何时完成,即所有文件何时处理完毕?
- 是否有一种方法可以“定时”处理器线程并在它花费“太长时间”时终止它(即,尽管经过了预先配置的时间量,它仍未返回结果)?
任何指向(伪)源代码的指针或示例将不胜感激。
【问题讨论】:
-
我不是线程专家,但这里是我的快速镜头给你一个方向: 1. 你可以使用等待/通知机制来控制报告行为。 2. 主管理器线程可以在读取文件时处理数据。是否需要等到所有文件都处理完? 3. TimerTask 在你的情况下可以派上用场。
-
感谢您的快速回答。管理器线程不需要等待所有处理器线程完成,但它确实需要知道它们何时完成。我宁愿不使用 wait()/notify(),因此引用 Callable 接口。无论如何,请将您的 cmets 放入答案中,以便我投票。 :-)
-
您是否需要同步对公共资源的访问?就像您在其中收集结果的文件或缓存一样?
-
是的,每个单独的处理器线程的结果都会有一个共同的“接收器”,但这会自行处理同步。
标签: java multithreading file callable