java并发编程学习:如何等待多个线程执行完成

2025-03-20 08:39:10
推荐回答(1个)
回答1:

实现方式多种多样,下面列两种供参考:

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("\n\n方式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;
    }
}