手头有以下代码:
ExecutorService executor = Executors.newFixedThreadPool(10);
Collection collection = new ArrayList();
for (int n=1; n<100; n++)
collection.add(new MyThread(n));
try {
List<Future<Boolean>> futures = executor.invokeAll(collection);
for(Future<Boolean> future : futures){
future.get();
if (future.isDone()) {
System.out.println("true");
}
else
System.out.println("false");
}
} catch (Exception e) {
e.printStackTrace();
}
如果以上是正确的?
如果所有future.isDone()
都为真,那么所有线程都已完成?
我怎样才能制作旗帜,以确保所有这些都已完成?
答案 0 :(得分:18)
作为对vainolo回复的评论,但我没有足够的声望点:
isDone
也是多余的,因为invokeAll
会返回isDone
为真的期货列表。 javadocs mention this。
答案 1 :(得分:7)
要检查是否所有都是真的,你可以这样做:
boolean works=true;
for(Future<Boolean> future : futures){
future.get();
if (future.isDone()) {
System.out.println("true");
}
else{
System.out.println("false");works=false;
}
}
if(works)System.out.println("yea it works")
答案 2 :(得分:2)
通常,您将Runnable任务添加到线程池。将线程添加到线程池不会按照您的想法进行。
当future.get()为每个任务返回时,所有任务都已完成。运行任务的线程仍将运行。
如果您想在任务完成后停止所有线程,可以使用executor.shutdown();
和executor.awaitTermination
我写它的方式是
ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<Boolean>> futures = new ArrayList<>();
for (int n = 0; n < 100; n++)
futures .add(executor.submit(new MyTask(n));
for(Future<Boolean> future : futures) {
boolean result = future.get();
// do something with the result.
}
如果您不需要结果,请输入Future<Void>
或Future<?>
或Future
答案 3 :(得分:2)
使用布尔变量是了解所有线程完成的最简单方法。 另一种方式可以是使用原语,例如整数。您可以简单地递增/递减计数器以查看是否所有线程都已完成。
另一种方法是检查awaitTermination()
对象上ExecutorService
调用的返回值。
int counter = 0;
for(Future<Boolean> future : futures)
{
future.get();
if (future.isDone())
System.out.println("true");
else
{
counter++;
System.out.println("false");
}
}
if(counter != 0)
System.out.println("DONE!");
// Another way of checking all threads are done.
if(executor.awaitTermination(100, TimeUnit.SECONDS))
System.out.println("DONE!");
答案 4 :(得分:1)
使用value = 1初始化变量检查并更新else中的值。然后在循环执行后检查check的值
if (future.isDone()) {
System.out.println("true");
}
else
{System.out.println("false");
check=0;}
答案 5 :(得分:0)
如果方法future.get
返回,那么未来完成的计算就完成了,因此调用isDone
是多余的。是的,在完成所有期货之后,ThreadPool
中的所有线程都应该可用。
答案 6 :(得分:0)
Invokeall调用此方法等待完成所有接受然后CPU执行到达for循环以检查完成 要么 我们需要吗... while循环检查任务完成