gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:43:44 29 4
gpt4 key购买 nike

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

下面是我的 worker 类(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);

解决方案

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

示例:https://stackoverflow.com/a/49746114/1815881您可以构造所有任务然后调用 invokeAll()在 ExecutorService 中。

关于java - 当等待一个线程的 Future 时,线程执行是否会继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54037788/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com