我正在使用 Java 中的线程编写应用程序,并且在循环中保持恒定数量的线程时遇到问题(新线程与新数据一起传入)。我使用 ExecutorService 来限制线程的数量,但是我在启动新线程时遇到了问题。
我有类似的东西:
ExecutorService execDownload = Executors.newFixedThreadPool(5);
UniqList<String> documentList = new UniqList<String>("startfile.txt");
Future<UniqList<String>> future;
while( !execDownload.isShutdown()) {
future = execDownload.submit(new Parser(documentList.get(i)));
i++;
try {
documentList.addAll(future.get());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Parser 是一个可调用对象,它返回 UniqList。我将此列表中的元素添加到我的全局列表中,该列表是所有文档名称的集合。问题是:我希望同时运行恒定数量的解析器。如果我在程序启动之前知道所有文件的名称,那将很简单,因为如果我有 100 个文件名,我只应该调用 ExecutorService submit() 方法,即 100 次,但我不知道所有文件的名称 - 名称通过调用以下代码进行解析:
new Parser(documentList.get(i))
并且名称在文件中。所以再问一次问题 - 当新数据到达时,如何保持恒定数量的线程?在上面的代码中,我只有一个 Future 对象,我认为这是我最大的问题 - 我应该创建 Futures 数组吗?但是然后如何检测来自 ExecutorService 的某个线程何时刚刚返回了一些新数据......
算法应该是(我认为):
- 使用初始参数启动程序(第一个文档名称)
- 项目清单
- 通过将 Parser 类提交给 ExecutorService 来启动 Parser 类,并从开始文件中提取所有文档名称
- 将 #2 中的文档名称添加到全局文档名称列表
- 创建另一个线程并使用全局文档名称列表中的名称解析文档。启动最大线程数(受 ExecutorService 限制)。解析每个下一个文件并从中提取新文件名
- 将 #3 中的名称添加到全局文档名称 List back to #4
如您所见,它就像递归。我觉得和解析网站一样的问题,1个起始节点,一级分类,二级文章等等。
链接或示例代码将非常有用。谢谢你。