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