JUC之CompletableFuture

news/2024/11/23 0:51:54/

文章目录

  • 1 Future接口
    • 1.1 FutureTask相关接口关系
    • 1.2 Future接口的优缺点
      • 1.2.1 优点
      • 1.2.2 缺点
  • 2 Complatable Future
    • 2.1 CompletionStage
    • 2.2 使用案例
      • 2.2.1 runAsync
      • 2.2.2 supplyAsync
      • 2.2.3 join和get的区别
      • 2.2.4 CF simple project使用案例
      • 2.2.5 CF 常用API
        • 2.2.5.1 获取结果和主动触发计算
        • 2.2.5.2 对计算结果进行处理
        • 2.2.5.3 对计算结果进行消费
        • 2.2.5.4 对计算速度进行选用

1 Future接口

在这里插入图片描述
在这里插入图片描述

1.1 FutureTask相关接口关系

在这里插入图片描述

1.2 Future接口的优缺点

1.2.1 优点

结合线程池,可以提升程序的运算效率。

1.2.2 缺点

(1) get方法阻塞
在这里插入图片描述
(2)isDone通常会轮询
在这里插入图片描述
在这里插入图片描述
我们还想需要:
(1) 缺少完成时的回调通知。
(2) 多个任务前后依赖可以组合处理。
(3)选择计算速度最快的那个线程。
在这里插入图片描述

2 Complatable Future

在这里插入图片描述
在这里插入图片描述

2.1 CompletionStage

在这里插入图片描述

2.2 使用案例

2.2.1 runAsync

在这里插入图片描述

2.2.2 supplyAsync

package org.example.completablefuturetest;import java.util.concurrent.*;public class CompletableFutureUseDemo {public static void main(String[] args) {ExecutorService threadPool = Executors.newFixedThreadPool(3);try {CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName() + "-------come in.");int result = ThreadLocalRandom.current().nextInt(10);try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("---------2s之后出结果---" + result);if (result > 2) {throw new RuntimeException("sk, throw a run time exception.");}return result;}, threadPool).whenComplete((value, exception) -> {if (exception == null) {System.out.println("-------计算完成,更新系统value:---" + value);}}).exceptionally(exception -> {System.out.println("sk, will handle a ex.");exception.printStackTrace();return null;});System.out.println(Thread.currentThread().getName() + "线程先去忙其他任务");} catch (Exception exception) {exception.printStackTrace();} finally {threadPool.shutdown();}}
}

2.2.3 join和get的区别

就是抛出的异常不一样。 join不需要使用方显示地捕获异常。

public class CompletableFutureMallDemo {public static void main(String[] args) {CompletableFuture cf = CompletableFuture.supplyAsync(new Supplier<String>() {@Overridepublic String get() {return "sk, 1234";}});System.out.println(cf.join());}
}

2.2.4 CF simple project使用案例

在这里插入图片描述

package org.example.cfmall;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.stream.Collectors;public class CompletableFutureMallDemo {static List<NetMall> list = Arrays.asList(new NetMall("jingdong"),new NetMall("dangdang"),new NetMall("taobao"));public static List<String> getPrice(List<NetMall> list, String productName) {// return getPriceStepByStep(list, productName);return getPriceAsync(list, productName);}private static List<String> getPriceAsync(List<NetMall> list, String productName) {return list.stream().map(netMall -> CompletableFuture.supplyAsync(new Supplier<String>() {@Overridepublic String get() {return String.format(productName + "in %s price is %.2f",netMall.getNetMallName(), netMall.calcPrice(productName));}})).collect(Collectors.toList()).stream().map(cf -> cf.join()).collect(Collectors.toList());}private static List<String> getPriceStepByStep(List<NetMall> list, String productName) {return list.stream().map(netMall -> String.format(productName + "in %s price is %.2f",netMall.getNetMallName(), netMall.calcPrice(productName))).collect(Collectors.toList());}public static void main(String[] args) {long startTime = System.currentTimeMillis();List<String> priceList = getPrice(list, "mysql");for (String price : priceList) {System.out.println(price);}long endTime = System.currentTimeMillis();System.out.println("------costTime: " + (endTime - startTime) + " ms");}
}@AllArgsConstructor
@NoArgsConstructor
@Data
class NetMall {private String netMallName;public double calcPrice(String productName) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}return ThreadLocalRandom.current().nextDouble() * 2 + productName.charAt(0);}
}

2.2.5 CF 常用API

2.2.5.1 获取结果和主动触发计算

在这里插入图片描述

2.2.5.2 对计算结果进行处理

在这里插入图片描述

2.2.5.3 对计算结果进行消费

在这里插入图片描述
带Async后缀和不带后缀的api的区别在这里插入图片描述
在这里插入图片描述

2.2.5.4 对计算速度进行选用


http://www.ppmy.cn/news/477493.html

相关文章

[Java实现 Scoket实时接收Tcp消息 优化层层叠加]

目录 &#x1f95e;前言: &#x1f95e;基础实现代码: &#x1f95e;描述: &#x1f95e;优化代码多线程处理客户端连接和消息接收: &#x1f95e; 描述: &#x1f95e;再次优化异步实现: &#x1f95e;以下是使用 CompletableFuture 实现异步处理客户端请求的示例代码…

C#探索之路(9):深入理解C#代码编译的过程以及原理

C#探索之路(9)&#xff1a;深入理解C#代码编译的过程以及原理 文章目录 C#探索之路(9)&#xff1a;深入理解C#代码编译的过程以及原理一、前言&#xff1a;概念解析1、编译器&#xff1a;2、JIT是什么&#xff1f;3、AOT是什么&#xff1f;4、如何理解这个“基于运行时”的概念…

C11 std::function 学习

此文&#xff0c; https://blog.csdn.net/bcbobo21cn/article/details/111658249 使用了一次C11 std::function&#xff0c;是作为函数指针使用的&#xff1b; 进一步的来说&#xff0c;C11的std::function可以对任何可以调用的目标实体进行调用操作&#xff1b; std::functi…

2019年哪些手机值得期待?

2019年哪些手机值得期待&#xff1f; 1.ipone11 苹果2019年要发布的三款新手机&#xff0c;预计在2019年9月份发布会上发布iphone11。此前&#xff0c;苹果刚刚解决棘手的5G芯片问题&#xff0c;而关于今年的新款iphone外观也是大家关注的重点。 亮点1 提升信号表现 苹果改进i…

2019年5G手机大爆发:目前已有9款,哪款最值得入手?

2019年才过了不到四分之一&#xff0c;没想到已经涌现出了一批5G手机。之前我们更多和大家谈论的是&#xff0c;5G手机有没有在今年入手的必要。毕竟截止目前5G网络仍未在国内正式商用&#xff0c;要等到5G手机真正普及还得到2020年以后。 尽管如此&#xff0c;相信还是有不少…

JWT入门指南

1、Token认证 随着 Restful API、微服务的兴起&#xff0c;基于 Token 的认证现在已经越来越普遍。基于token的用户认证是一种服务端无状态的认证方式&#xff0c;所谓服务端无状态指的token本身包含登录用户所有的相关数据&#xff0c;而客户端在认证后的每次请求都会携带toke…

在坦桑尼亚如何打国际长途,打给你中国的朋友?

只要你充值了&#xff0c;就可以直接打回 国内任何电话 当然要在号码前加拨 “ 86”例如拨号132********就拨“86132********” 座机 如010******** 就拨8610*********不要拨座机区号前面的0 就可以了,发信息也是一样的。 记得要拨一个“”号&#xff0c;要不&#xff0c;联系不…

国内用户访问国内服务器,国外用户访问国外服务器

1、域名智能解析 通过来源&#xff0c;来解析访问服务器 添加记录值页面进行操作 2、域名判断 每个项目国内外配置域名&#xff0c;判断ip地址&#xff0c;访问不同域名。来达到效果 3、dns 在全局流量管理中&#xff0c;点击创建进行配置访问策略