等待一个线程的 Future 时线程执行是否会继续

Will thread execution continues when waiting for Future of one thread

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

下面是我的工人class:

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) 之前等待 (2) 每次执行的代码。换句话说:在主线程中提交任务,等待在主线程中完成执行并在之后提交下一个任务。

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);

解决方案

要解决这个问题,您应该(从主线程的角度)不等待地提交所有任务,然后等待执行程序服务的结果。

示例: 您可以构建所有任务,然后在 ExecutorService 中调用 invokeAll()