主线程等待多个子线程执行完了在执行

本文介绍了Java并发库中CountDownLatch类的应用实例。通过创建CountDownLatch对象并设置初始计数器值,多个子线程调用countDown方法递减计数器,当计数器归零时,等待在await方法上的主线程将被唤醒并继续执行。

CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。

代码如下:

package Thread;

import java.util.concurrent.CountDownLatch;

/**
 * 
 * @author Cshuzhuo
 * @date 2018-03-13
 */
public class MyThreadTest implements Runnable{
	
	private CountDownLatch countDownLatch;
	
	public MyThreadTest(CountDownLatch countDownLatch) {
		this.countDownLatch=countDownLatch;
	}
	public void run() {
		System.out.println(Thread.currentThread().getName()+"--子线程执行--");
		countDownLatch.countDown();
	}
}
package Thread;

import java.util.concurrent.CountDownLatch;

/**
 * 
 * @author Cshuzhuo
 * @date 2018-03-13
 */
public class CountDownLatchTest {
	
	public static void main(String[] args) throws Exception {
		CountDownLatch count = new CountDownLatch(5);
		new Thread(new MyThreadTest(count)).start();
		new Thread(new MyThreadTest(count)).start();
		new Thread(new MyThreadTest(count)).start();
		new Thread(new MyThreadTest(count)).start();
		new Thread(new MyThreadTest(count)).start();
		count.await();
		System.out.println("主线程执行");
	}
	
	
	
}

 

 

 

说明:调用await()方法的线程会被一直阻塞,它会等待直到count值为0才继续执行31

countDown() 会让count-1

 

 

 

<think>嗯,用户的问题是关于Java中主线程等待个子线程执行完成的方法。从用户提供的引用材料来看,用户已经接触过join()和CountDownLatch两种方案,但可能还需要更全面的总结。 用户可能正在开发多线程应用,需要协调主线程和子线程执行顺序。这类问题常见于需要汇总子任务结果的场景,比如并行计算或批量数据处理。用户提供的引用显示ta已经查阅过相关资料,但可能对具体实现细节或方案选择有疑问。 从技术角度,这个问题可以从以下几个方面展开: 1. join()方法是最基础的方案,但循环内错误使用会导致串行执行(如引用[3]的警告) 2. CountDownLatch更灵活,特别适合固定数量的子线程(引用[2][4]都展示了典型用法) 3. 其实还有ExecutorService和CompletableFuture等更现代的方案值得补充 用户可能没意识到不同方案的适用场景差异: - 少量线程用join足够 - 线程数动态变化时CountDownLatch更合适 - 需要线程池管理则首选ExecutorService - CompletableFuture适合异步编程 需要特别注意引用[3]提到的join()使用陷阱,这个实际开发中很容易踩坑。另外CyclicBarrier方案虽然用户没提到,但作为CountDownLatch的增强版值得介绍。 在代码示例方面: - 要修正引用[3]的错误join用法 - 补充CyclicBarrier的代码模板 - 对CompletableFuture给出简化示例 最后的相关问题设计要覆盖: 1. 方案选择依据(帮助用户决策) 2. 超时处理(实际项目必备) 3. 异常处理机制(关键但常被忽视) 4. 线程池集成(工程化实践)</think>在Java中实现主线程等待所有子线程完成执行,主要有以下几种方法(附代码示例): ### 1. 使用 `Thread.join()`(适合线程数量固定) ```java Thread t1 = new Thread(() -> System.out.println("子线程1执行")); Thread t2 = new Thread(() -> System.out.println("子线程2执行")); t1.start(); t2.start(); try { t1.join(); // 主线程阻塞等待t1 t2.join(); // 主线程阻塞等待t2 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("所有子线程执行完毕"); ``` > **注意**:`join()` 需在启动所有线程后调用,避免在循环内调用导致串行执行[^3]。 --- ### 2. 使用 `CountDownLatch`(推荐动态线程) ```java int threadCount = 5; CountDownLatch latch = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + "执行"); } finally { latch.countDown(); // 计数器减1 } }).start(); } latch.await(); // 主线程阻塞直到计数器归零 System.out.println("所有子线程完成"); ``` > **优势**:精确控制线程数量,支持超时等待(`await(long timeout, TimeUnit unit)`)[^2][^4]。 --- ### 3. 使用 `ExecutorService`(线程池管理) ```java ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 5; i++) { executor.submit(() -> System.out.println("子线程执行")); } executor.shutdown(); // 停止接收新任务 try { executor.awaitTermination(10, TimeUnit.SECONDS); // 阻塞等待所有任务完成 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程池任务全部结束"); ``` --- ### 4. 使用 `CompletableFuture`(Java 8+) ```java List<CompletableFuture<Void>> futures = new ArrayList<>(); for (int i = 0; i < 5; i++) { futures.add(CompletableFuture.runAsync(() -> System.out.println("异步任务执行")) ); } CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) .join(); // 阻塞等待所有future完成 System.out.println("所有异步任务结束"); ``` --- ### 方案对比 | **方法** | **适用场景** | **线程管理** | **扩展性** | |-------------------|--------------------------|-------------|-----------| | `Thread.join()` | 少量固定线程 | 手动管理 | ⭐⭐ | | `CountDownLatch` | 动态线程/精确控制 | 半自动 | ⭐⭐⭐⭐ | | `ExecutorService` | 线程池/任务调度 | 自动管理 | ⭐⭐⭐⭐⭐ | | `CompletableFuture`| 异步编程/链式调用 | 自动管理 | ⭐⭐⭐⭐⭐ | > **关键点**: > - 优先选择 `CountDownLatch` 或 `ExecutorService` 避免 `join()` 的串行化陷阱[^3] > - 需要超时控制时使用 `awaitTermination()` 或 `await(timeout, unit)` > - 线程池方案更利于资源复用和异常处理[^1] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值