我想知道,当程序等待一个线程的Future对象时,其他线程将继续执行。
我尝试了以下示例,似乎当我的程序正在等待一个线程时,其他线程未在继续执行。请告诉我这是否正确,或者我处理线程的代码是否有问题。
ExecutorService executor = Executors.newFixedThreadPool(3);
for(int i=0; i<5 ;i++)
{
Worker w = new Worker();
Future<String> future = executor.submit(w);
while(!future.isDone())
{
//Wait
}
String s = future.get();
System.out.println(LocalDateTime.now()+" "+s);
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
下面是我的工人阶级:
public class Worker implements Callable<String> {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
Thread.sleep(3000);
return Thread.currentThread().getName();
}
}
我得到以下结果(添加日期时间以显示结果不平行):
2019-01-04T16:34:22.647 pool-1-thread-1
2019-01-04T16:34:25.661 pool-1-thread-2
2019-01-04T16:34:28.673 pool-1-thread-3
2019-01-04T16:34:31.685 pool-1-thread-1
2019-01-04T16:34:34.699 pool-1-thread-2
答案 0 :(得分:2)
问题
您介绍了从主线程角度等待每次执行(2),然后提交新任务(1)的代码。换句话说:在主线程中提交任务,等待在主线程中完成执行,然后再提交下一个任务。
ExecutorService executor = Executors.newFixedThreadPool(3);
for(int i=0; i<5 ;i++)
{
Worker w = new Worker();
Future<String> future = executor.submit(w); // (1)
while(!future.isDone()) // (2)
{
//Wait
}
String s = future.get();
System.out.println(LocalDateTime.now()+" "+s);
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
解决方案
要解决该问题,您应该(从主线程角度)提交所有任务而无需等待,然后等待执行者服务的结果。
示例:https://stackoverflow.com/a/49746114/1815881
您可以构造所有任务,然后在ExecutorService中调用invokeAll()
。