当前位置: 首页 > 图灵资讯 > 技术篇> Java子线程执行完毕如何通知主线程?

Java子线程执行完毕如何通知主线程?

来源:图灵教育
时间:2025-02-27 17:39:59

java子线程执行完毕如何通知主线程?

Java子线程完成后的主线程通知机制

在Java多线程编程中,通常需要在子线程执行后通知主线程。本文将介绍两种常用的方法:CompletableFuture.allOf() 和 CountDownLatch。

方法1:使用Completablefure.allOf()

CompletableFuture 提供了 allOf() 可以等多种方法 CompletableFuture 所有对象都完成了。 我们可以为每个子线程创建一个 CompletableFuture,子线程执行完成后完成 CompletableFuture。

立即学习“Java免费学习笔记(深入);

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;

public class Main {
    public static void main(String[] args) {
        List<String> list = new CopyOnWriteArrayList<>();

        CompletableFuture<Void> futureA = CompletableFuture.runAsync(() -> {
            // 子线程 A 的计算逻辑
            list.addAll(Arrays.asList("A1", "A2", "A3"));
        });

        CompletableFuture<Void> futureB = CompletableFuture.runAsync(() -> {
            // 子线程 B 的计算逻辑
            list.addAll(Arrays.asList("B1", "B2", "B3"));
        });

        CompletableFuture.allOf(futureA, futureB).thenRun(() -> {
            System.out.println("执行所有子线程后,开始处理 list: " + list);
        });
    }
}

方法二:使用CountDownlatch

CountDownLatch 也是线程同步工具。构造函数接收整数参数,表示需要等待的线程数量。子线程执行后调用 countDown() 方法递减计数器。调用主线程 await() 等待计数器变为零的方法。

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CopyOnWriteArrayList;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        List<String> list = new CopyOnWriteArrayList<>();
        CountDownLatch latch = new CountDownLatch(2);

        Thread threadA = new Thread(() -> {
            // 子线程 A 的计算逻辑
            list.addAll(Arrays.asList("A1", "A2", "A3"));
            latch.countDown();
        });

        Thread threadB = new Thread(() -> {
            // 子线程 B 的计算逻辑
            list.addAll(Arrays.asList("B1", "B2", "B3"));
            latch.countDown();
        });

        threadA.start();
        threadB.start();

        latch.await(); // 等待所有子线程完成

        System.out.println("执行完所有子线程后,开始处理 list: " + list);
    }
}

考虑线程安全

需要注意的是,ArrayList 线程不安全。为了避免并发问题,我们使用了线程安全 CopyOnWriteArrayList。 根据具体的场景和需求,选择哪种方法,CompletableFuture 更适合异步编程场景, CountDownLatch 更适合需要精确控制线程同步的场景。

以上是Java子线程执行后如何通知主线程?详情请关注图灵教育其他相关文章!