for (int i = 1; i <= 50; i++) {
Future<Object> future = executorService.submit(new MyWorker(i));
// res.add(future);
future.get();
}
Future类的get()方法会阻塞主线程,导致多线程执行变成了单线程。如下:
而使用list暂存future结果,就可以避免主线程阻塞的问题:
for (int i = 1; i <= 50; i++) {
Future<Object> future = executorService.submit(new MyWorker(i));
res.add(future);
// future.get();
}
附上实验代码:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class Test {
public static volatile boolean flag = true;
public static void setFlag(){
flag = false;
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newWorkStealingPool();
List<Future<Object>> res = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
// executorService.submit(new MyWorker(i));
Future<Object> future = executorService.submit(new MyWorker(i));
res.add(future);
// future.get();
// System.out.println(Future.get());
}
System.out.println(flag);
while (flag) {
executorService.shutdown();
// System.out.println("ThreadPool shutdown");
}
System.out.println(flag);
System.out.println("success ending");
}
}
class MyWorker implements Callable {
private int i;
MyWorker(int _i){
i = _i;
}
@Override
public Object call() throws Exception {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i == 45){
Test.setFlag();
}
System.out.println(Thread.currentThread().getName()+"\t print number:"+i);
return Thread.currentThread().getName();
}
}