当前位置: 首页 > news >正文

Java高级-CompletableFuture并发编程利器

CompletableFuture核心Api

  • 1.概述
  • 2.Async
    • 2.a) supplyAsync
    • 2.b) runAsync
  • 3.Then
    • 3.a) thenApply()
    • 3.b) thenApplyAsync()

1.概述

Future可以在并发编程中异步获取结果
CompletableFuture实现了Future接口,肯定也会有Future的功能,也相当于是Future的一个升级版。
同时还实现了CompletionStage接口,CompletionStage表示某一个步骤,可以编排某些并发编程任务的功能

2.Async

2.a) supplyAsync

异步执行任务,任务有返回值
supplyAsync实现了Supplier接口

@Test
public void testSupplyAsync() throws ExecutionException, InterruptedException {// 设置线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 建议自己设置一个线程池。若未指定,将使用默认的线程池,会造成整个应用都会使用同一个线程池,会不太好CompletableFuture<String> task = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());return "hello";}, executorService);// get()获取结果System.out.println(task.get());
}

2.b) runAsync

异步执行任务,任务没有返回值
runAsync实现了Runnable接口

@Test
public void testRunAsync() throws ExecutionException, InterruptedException {// 设置线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 建议自己设置一个线程池。若未指定,将使用默认的线程池,会造成整个应用都会使用同一个线程池,会不太好CompletableFuture task = CompletableFuture.runAsync(() -> System.out.println(Thread.currentThread().getName()));// get()获取结果System.out.println(task.get());
}

3.Then

当前一个异步任务执行完,才能执行本任务
当前执行thenApply()方法的线程来负责执行本任务,比如main线程。但是如果前一个异步任务还没有执行完,那么main线程就不能执行本任务了,要等前一个任务执行完后才能执行本任务。

3.a) thenApply()

当要睡眠1秒时,由主线程执行taskB
当不需要睡眠时,由执行taskA的子线程执行taskB,main线程会直接往下运行

@Test
public void testThen() throws InterruptedException {// 设置线程池ExecutorService executorService = Executors.newFixedThreadPool(10);Supplier<String> taskA = () -> {System.out.println("1: " + Thread.currentThread().getName());return "TaskA";};Function<String, String> taskB = (s) -> {System.out.println("2: " + Thread.currentThread().getName());return s + "TaskA";};CompletableFuture<String> future = CompletableFuture.supplyAsync(taskA, executorService);Thread.sleep(1000);// taskB 在 taskA 任务后执行,future.thenApply(taskB);System.out.println(Thread.currentThread().getName() + ": Finish...");
}

3.b) thenApplyAsync()

用另外的线程去执行任务
可以指定线程池来运行任务,若未指定,将使用默认的线程池。
该方法不会使用main线程去执行taskB

@Test
public void testThen() throws InterruptedException {// 设置线程池ExecutorService executorService = Executors.newFixedThreadPool(10);Supplier<String> taskA = () -> {System.out.println("1: " + Thread.currentThread().getName());return "TaskA";};Function<String, String> taskB = (s) -> {System.out.println("2: " + Thread.currentThread().getName());return s + "TaskA";};CompletableFuture<String> future = CompletableFuture.supplyAsync(taskA, executorService);Thread.sleep(1000);// taskB 在 taskA 任务后执行,future.thenApplyAsync(taskB, executorService);System.out.println(Thread.currentThread().getName() + ": Finish...");
}
http://www.lryc.cn/news/194353.html

相关文章:

  • python、java、c++哪一个前景比较好?
  • 【排序算法】详解直接插入排序和希尔排序原理及其性能分析
  • JDK1.8对HashMap的优化、以及通过源码解析1,8扩容机制
  • Linux串口断帧处理
  • springboot集成kafka
  • 近期总结2023.10.16
  • 【EI会议征稿】第二届可再生能源与电气科技国际学术会议(ICREET 2023)
  • 让ChatGPT等模型学会自主思考!开创性技术“自主认知”框架
  • Jmeter脚本参数化和正则匹配
  • vue 请求代理 proxy
  • 使用Spring Boot构建稳定可靠的分布式爬虫系统
  • 分享一个查询OpenAI Chatgpt key余额查询的工具网站
  • 【LeetCode刷题(数据结构与算法)】:二叉树的后序遍历
  • 内网、外网、宽带、带宽、流量、网速之间的区别与联系
  • 打造类ChatGPT服务,本地部署大语言模型(LLM),如何远程访问?
  • linux平台的无盘启动开发
  • 【GO入门】环境配置及Vscode配置
  • 家政服务小程序,家政维修系统,专业家政软件开发商;家政服务小程序,家政行业软件开发
  • 英语——语法——从句——状语从句——笔记
  • Linux 学习的六个过程
  • 『heqingchun-ubuntu系统下安装nvidia显卡驱动3种方法』
  • [paddle]paddleseg中eiseg加载模型参数的模型下载地址
  • 标定板生成网址,可以直接打印,matlab标定工具箱
  • React高级特性之受控和非受控组件
  • Android 14 正式发布,已经在 AOSP 中上线
  • 软件开发介绍
  • Go 匿名函数与闭包
  • html关闭空标签
  • Java实现B树
  • crontab报错/var/spool/cron : Permission denied和 -bash: chattr: command not found