【发布时间】:2014-01-07 15:16:41
【问题描述】:
我在 Java 中使用 FixedThreadPool 来处理图像。我遇到的问题是,首先我正在解析一个 xml,使用这个 xml 的信息我正在启动池中的线程(用于下载东西)。
现在的问题是,我在 xml 中的每个
xml:
<object>
<download></download>
<download></download>
<download></download>
</object>
<object>
<download></download>
<download></download>
</object>
我正在使用下载信息创建一个 ArrayList,然后将其传递给线程池。
线程池如下所示:
public void addAnhang(ArrayList<Anhang> a, String intern_id){
this.generateFolder(intern_id);
for(Anhang anh:a){
anh.setZielordner(props.getProperty("zielordner_anhang")+intern_id+File.separator);
this.tasks.add(Executors.callable(new AnhangWorker(anh)));
//this.pool.execute(new AnhangWorker(anh));
}
try {
this.pool.invokeAll(tasks);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end of this cycle");
}
所以现在我的问题。我怎么知道我的所有线程何时完成? xml 解析器比下载快,所以在 xml 完成后我不能杀死所有线程。但我不知道线程池何时完成下载所有文件。
【问题讨论】:
-
好的,但是在 awaitTermination 中我需要哪些参数(可能是线程池比 xml 解析器需要多 5 分钟)
-
我尝试过这样的事情:while(!this.poool.awaitTermination(10, TimeUnit.SECONDS)) System.out.println("pool still running");但它也不会在线程完成后关闭..
-
这应该可以,但循环没有意义,除非你需要在循环中做一些事情。
-
哦...谢谢。哈哈失败。 while(!this.pool.awaitTermination(10, TimeUnit.Seconds)){ System.out.println("池仍在运行"); this.pool.shutdown();} 这修复了它:) 再次感谢
-
我已将我的 cmets 移到一个答案中,因此您可以根据需要接受它。此外,您应该在将所有作业提交到线程池之后并在调用
awaitTermination(...)之前 调用pool.shutdown()。您应该不循环调用shutdown()。
标签: java multithreading