带有invokeAll()的ExecutorService和java中的Future
手头有以下代码:带有invokeAll()的ExecutorService和java中的Future,java,Java,手头有以下代码: 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>> futu
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();
}
ExecutorService executor=Executors.newFixedThreadPool(10);
集合集合=新的ArrayList();
对于(int n=1;n如果方法future.get
返回,那么future完成的计算就完成了,因此调用isDone
是多余的。是的,在所有future完成ThreadPool
中的所有线程后,线程池中的所有线程都应该可用。通常情况下,将可运行任务添加到线程池中。将线程添加到thread pool不会做你认为的事
当future.get()返回每个任务时,所有任务都已完成。运行任务的线程仍将运行
如果要在任务完成后停止所有线程,可以使用executor.shutdown();
和executor.waitivetermination
我写它的方式是
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.
}
ExecutorService executor=Executors.newFixedThreadPool(10);
列表期货=新的ArrayList();
对于(int n=0;n<100;n++)
futures.add(executor.submit)(newmytask(n));
for(未来:未来){
布尔结果=future.get();
//对结果做点什么。
}
如果不需要结果来执行类型Future
或Future
或只是Future
初始化一个值为1的变量检查,并更新else中的值。然后在执行循环后检查检查的值
if (future.isDone()) {
System.out.println("true");
}
else
{System.out.println("false");
check=0;}
要检查所有这些是否都是真的,可以执行以下操作:
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")
boolean works=true;
for(未来:未来){
future.get();
if(future.isDone()){
System.out.println(“真”);
}
否则{
System.out.println(“false”);works=false;
}
}
if(起作用)System.out.println(“是的,起作用”)
使用布尔变量是理解所有线程都已完成的最简单方法。
另一种方法是使用原语,例如整数。您可以简单地增加/减少计数器,以查看是否所有线程都已完成
另一种方法是检查ExecutorService
对象上的awaittemination()
调用的返回值
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!");
int计数器=0;
for(未来:未来)
{
future.get();
if(future.isDone())
System.out.println(“真”);
其他的
{
计数器++;
System.out.println(“假”);
}
}
如果(计数器!=0)
System.out.println(“完成!”);
//检查所有线程是否完成的另一种方法。
if(执行器等待终止(100,时间单位秒))
System.out.println(“完成!”);
意思是对瓦伊诺洛的回复发表评论,但我没有足够的信誉点:
isDone
也是多余的,因为invokeAll
返回一个未来列表,其中isDone
为true。javadocs。调用此方法的invokeAll将等待完成所有take,然后CPU执行到达for循环以检查是否完成
或
我们是否需要执行..While循环检查任务的完成情况如果不是我想的那样,我如何确保所有线程都完成了?您将任务添加到线程池,而不是线程,因为线程池已经有自己的线程。如果您将线程添加到线程池,它甚至不会start()
MyTask,因为它需要可运行。因此您可以将其称为MyTask
,并等待所有任务完成。您可以使用invokeAll()但我更喜欢边做边创建。有必要同时使用.get和.isDone吗?如果没有,哪一个对我的问题更好?@fen1kss get和isDone是不同的方法。所以问“哪一个对我的问题更好?”是毫无意义的。我想,你使用这些方法的方式似乎还可以。那么我可以删除这一部分吗?如果(future.isDone()){System.out.println(“true”);}else{System.out.println(“false”);}我想是的。forFuture
声明get
“在必要时等待计算完成,然后检索其结果。”。因此,实际上您还需要将isDone
包装到它自己的异常处理程序中。我认为这是最好的答案。为了澄清这一点,invokeAll在所有任务完成之前不会返回,即它是阻塞的。(存在非阻塞的重载)