JUC_CompletableFuture异步编排

创建异步对象

公有线程池

public static ExecutorService executor=new ThreadPoolExecutor(5, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(20));

有返回值supplyAsync

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
	return 1 + 1;
}, executor);
System.out.println(future.get());

无返回值runAsync

CompletableFuture.runAsync(()->{
    int i=1+1;
}, executor);

任务完成时回调方法

任务完成后感知结果和异常whenCompleteAsync、exceptionally

CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
    return 1 + 1;
    // 感知到异常,无法修改结果
}, executor).whenCompleteAsync((result,exception)->{
    System.out.println(result+":"+exception);
    // 感知到异常,同时返回另外值(非结果相关值)
},executor).exceptionally(exception->{
   return 1+1;
});

任务完成后处理结果和异常handle

CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> {
    return 1 + 1;
}, executor).handle((result,exception)->{
    if(result!=null){
        return  result;
    }
    return -1;
});

线程串行化

不接收前一任务的结果,自身无返回值thenRunAsync

CompletableFuture<Void> future4 = CompletableFuture.supplyAsync(() -> {
    return 1 + 1;
}, executor).thenRunAsync(()->{
    System.out.println("silence");
}, executor);

接收前一任务的结果,自身无返回值thenAcceptAsync

CompletableFuture<Void> future5 = CompletableFuture.supplyAsync(() -> {
    return 1 + 1;
}, executor).thenAcceptAsync(System.out::println, executor);

接收前一任务的结果,自身有返回值thenApplyAsync

CompletableFuture<Object> future6 = CompletableFuture.supplyAsync(() -> {
    return 1 + 1;
}, executor).thenApplyAsync(result->{
    return result*2;
},executor);
System.out.println(future6.get());

两任务完成后,执行第三任务

CompletableFuture<Integer> future7 = CompletableFuture.supplyAsync(() -> {
    System.out.println(1);
    return 1 + 1;
}, executor);

CompletableFuture<Integer> future8 = CompletableFuture.supplyAsync(() -> {
    System.out.println(2);
    return 2 + 2;
}, executor);

//runAfterBoth不能获取前两者结果
future7.runAfterBothAsync(future8, ()->{
    System.out.println(3);
}, executor);
//thenAcceptBoth获取两者返回值,无返回值
future7.thenAcceptBothAsync(future8, (r1,r2)->{
    System.out.println(r1+r2);
},executor);
//thenCombine获取两者返回值,有返回值
CompletableFuture<Integer> future9 = future7.thenCombineAsync(future8, Integer::sum, executor);
System.out.println(future9.get());

两任务之一完成后,执行第三任务

//runAfterEither不感知结果,无返回值
future7.runAfterEitherAsync(future8, ()->{
    System.out.println("one completed");
}, executor);
//acceptEither 感知第一个完成的结果,无返回值
future7.acceptEitherAsync(future8, System.out::println, executor);
//applyToEither感知第一个完成的结果,有返回值
future7.applyToEitherAsync(future8, result->{
    return result*2;
}, executor);

多任务组合

CompletableFuture<Integer> future11 = CompletableFuture.supplyAsync(() -> {
    System.out.println(1);
    return 1 + 1;
}, executor);

CompletableFuture<Integer> future12 = CompletableFuture.supplyAsync(() -> {
    System.out.println(2);
    return 2 + 2;
}, executor);

CompletableFuture<Integer> future13 = CompletableFuture.supplyAsync(() -> {
    System.out.println(3);
    return 3 + 3;
}, executor);
// 等待所有任务都完成
CompletableFuture<Void> allOf = CompletableFuture.allOf(future11, future12, future13);
//无返回值
allOf.get();
System.out.println(future11.get()+":"+future12.get()+":"+future13.get());

//有一个任务完成,返回值为完成任务的返回值
CompletableFuture<Object> anyOf = CompletableFuture.anyOf(future11, future12, future13);
Object o = anyOf.get();
<think>嗯,用户想了解Java JUC中的并发工具类,特别是CountDownLatch、CompletableFuture和AtomicInteger,还要完整的清单。首先,我需要回忆JUC的主要组件,确保覆盖核心工具类。 首先,JUC的并发工具类有很多,比如CountDownLatch、CyclicBarrier、Semaphore这些同步工具,还有CompletableFuture用于异步编程,原子类如AtomicInteger。用户提到的这三个需要详细解释,所以每个都要分点说明,包括作用、使用场景和示例代码。 然后,完整清单部分需要列出所有重要的工具类,可能包括线程池相关(如ExecutorService)、并发集合(如ConcurrentHashMap)、锁(如ReentrantLock)、原子类、Future、Phaser等。要注意分类,比如同步工具、并发集合、原子类、线程池等,这样结构更清晰。 接下来,用户提供的引用中有提到CountDownLatch的使用场景,比如主线程等待子线程完成,还有ZK分布式锁的例子。这些可以作为实际应用的例子,增强回答的实用性。另外,引用3和4都涉及CountDownLatch,需要正确引用这些资料,标注来源。 需要确保每个工具类的解释简明扼要,示例代码用Java,并且符合语法。比如CountDownLatch的示例代码应该展示如何初始化计数器,子线程countDown,主线程await。CompletableFuture的示例可能需要展示链式调用和组合异步任务。AtomicInteger则要展示原子操作的例子,比如incrementAndGet。 可能还需要注意用户是否需要比较不同工具类的区别,比如CountDownLatch和CyclicBarrier的不同,但用户没有明确问,所以可能在完整清单里简要提一下。另外,确保回答结构清晰,分点列出,每个工具类有简介和示例,这样用户容易理解。 最后,生成的相关问题需要围绕JUC工具类的其他部分,比如线程池、并发容器、锁机制等,这样用户如果有进一步的问题可以继续提问。例如,如何选择不同的同步工具,或者原子类的实现原理。</think>### Java JUC 并发工具类详解 #### 一、核心工具类介绍 1. **CountDownLatch** - **作用**:允许一个或多个线程等待其他线程完成操作,基于计数器实现[^3][^4]。 - **使用场景**:多线程任务同步(如主线程等待子线程全部完成)、分布式协调等。 - **示例代码**: ```java CountDownLatch latch = new CountDownLatch(3); new Thread(() -> { // 子线程任务 latch.countDown(); }).start(); latch.await(); // 主线程阻塞直至计数器归零 ``` 2. **CompletableFuture** - **作用**:支持异步编程,可链式组合多个异步任务,处理回调与结果转换[^2]。 - **使用场景**:异步任务编排、并行计算、非阻塞I/O操作。 - **示例代码**: ```java CompletableFuture.supplyAsync(() -> "Hello") .thenApplyAsync(s -> s + " World") .thenAccept(System.out::println); ``` 3. **AtomicInteger** - **作用**:提供原子性整数操作(如增减、比较交换),基于CAS(Compare-And-Swap)实现[^2]。 - **使用场景**:计数器、状态标记等需线程安全的场景。 - **示例代码**: ```java AtomicInteger counter = new AtomicInteger(0); counter.incrementAndGet(); // 原子性自增 ``` --- #### 二、JUC并发工具类完整清单 | **类别** | **工具类/接口** | **核心功能** | |------------------|----------------------------------------|----------------------------------------------| | **同步工具** | `CountDownLatch` | 线程等待计数器归零 | | | `CyclicBarrier` | 多线程到达屏障后同步执行 | | | `Semaphore` | 控制并发线程数(信号量机制) | | **原子类** | `AtomicInteger`/`AtomicLong` | 原子性整数/长整数操作 | | | `AtomicReference` | 原子性对象引用操作 | | **并发集合** | `ConcurrentHashMap` | 线程安全的哈希表 | | | `CopyOnWriteArrayList` | 写时复制的线程安全列表 | | **线程池** | `ExecutorService` | 线程池管理与任务调度 | | | `ThreadPoolExecutor` | 自定义线程池配置 | | **锁机制** | `ReentrantLock` | 可重入锁,替代`synchronized` | | | `StampedLock` | 乐观读锁,减少竞争开销 | | **异步编程** | `CompletableFuture` | 异步任务编排与结果处理 | | | `Future` | 表示异步计算结果 | | **其他工具** | `Phaser` | 分阶段的多线程同步(替代`CyclicBarrier`) | | | `Exchanger` | 线程间数据交换 | --- #### 三、关键特性对比 | **工具类** | **线程安全** | **适用场景** | **性能特点** | |------------------|-------------|--------------------------|-------------------------| | `CountDownLatch` | 是 | 一次性线程同步 | 轻量级,计数器不可重置 | | `CyclicBarrier` | 是 | 多阶段线程同步 | 支持计数器重置 | | `AtomicInteger` | 是 | 高并发计数/状态管理 | 无锁操作,CAS实现 | --- §§ 相关问题 §§ 1. `ReentrantLock`与`synchronized`的区别及适用场景? 2. 如何通过`ThreadPoolExecutor`自定义线程池参数? 3. `ConcurrentHashMap`如何实现高并发下的线程安全? 4. `Semaphore`在流量控制中的应用示例?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值