java并发编程学习:如何等待多个线程执行完成
王子傲
2022-04-06 03:40:42
共 1 个回答
李鑫雨
2022-04-09 06:55:52
实现方式多种多样,下面列两种供参考:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;public class Main {
public static void main(String[] args) throws InterruptedException, ExecutionException {
System.out.println("方式1");
System.out.println("================================================");
// 方式1
// 创建一个线程池,并创建10个线程放入线程池执行
ExecutorService pool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
pool.execute(new MyThread("线程" + i));
}
// 线程池不再接收新任务
pool.shutdown();
// 线程池中的所有线程都执行完pool.isTerminated()才返回true
while (!pool.isTerminated()) {
Thread.sleep(100);
}
System.out.println("所有线程执行完成");
System.out.println("
方式2");
System.out.println("================================================");
// 方式2
ExecutorService pool2 = Executors.newCachedThreadPool();
List futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
// 使用实现Callable接口的方式创建线程,通过Future可以获取线程中返回的结果
Future future = pool2.submit(new MyThread2("线程" + i));
futures.add(future);
}
for (Future future : futures) {
// 该方法会阻塞主线程,直到线程执行完成
future.get();
}
System.out.println("所有线程执行完成");
}
}
class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "执行完成");
}
}class MyThread2 implements Callable {
private String name;
public MyThread2(String name) {
this.name = name;
}
@Override
public Object call() throws Exception {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "执行完成");
return null;
}
}
阅读原文