等待一个线程的将来时,线程执行将继续吗

时间:2019-01-04 11:07:35

标签: java multithreading future executorservice

我想知道,当程序等待一个线程的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

1 个答案:

答案 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()