JUC之CompletableFuture

news2024/11/27 16:50:15

文章目录

  • 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>() {
            @Override
            public 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>() {
            @Override
            public 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.coloradmin.cn/o/664942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中将局部变量赋值给全局变量的方法

Python中将局部变量赋值给全局变量的方法 Python是一种灵活、高效的编程语言&#xff0c;许多开发人员喜欢使用这种语言来开发应用程序。在Python中&#xff0c;我们可以定义全局变量和局部变量。全局变量是定义在整个程序中的变量&#xff0c;而局部变量是定义在函数中的变量…

io.netty学习(五)ChannelPipeline

目录 前言 ChannelPipeline 接口 创建 ChannelPipeline ChannelPipeline 事件传输机制 ChannelPipeline 中的 ChannelHandler ChannelHandlerContext 接口 总结 前言 我们在前面的文章中也对ChannelPipeline接口做了初步的介绍。 io.netty学习使用汇总 ChannelPipeli…

chatgpt赋能python:Python把图片转换为图片代码

Python把图片转换为图片代码 在现代计算机应用和互联网中&#xff0c;图像已经成为不可或缺的一部分。然而&#xff0c;我们有时需要将图像转换为代码&#xff0c;以便在我们的应用程序中使用它或通过互联网共享它。Python作为一种流行的编程语言&#xff0c;提供了许多很好的…

如何判断商城源码是否靠谱?

伴随着电子商务的快速发展&#xff0c;商城系统成为了企业发展的重要工具。选择适合自己企业的商城系统源码是一个关键问题&#xff0c;因为它关系到企业未来的发展。那么如何判断商城系统源码是否靠谱呢&#xff1f; 一、核心技术 商城系统的核心技术是网站建设开发&#xff…

JWT入门指南

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

利用SQL注入漏洞登录后台

所谓SQL注入&#xff0c;就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令&#xff0c;比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的&#xff0c;这类表单特别容易受到SQ…

A7+linux4.14内核SPI 总线通讯异常问题分析

I.问题现象、 2023年1月18日&#xff0c;A7核心板 升级内核版本时&#xff0c;发现SPI总线无法跟wk2168通讯&#xff0c;打印信息如下&#xff1a;nts_io_init in gpmi-nand 1806000.gpmi-nand: mode:4 ,failed in set feature. [bus:0~select:0]wk2xxx_probe() GENA 0xFF reg…

【动态规划】简单多状态dp问题(2)买卖股票问题

买卖股票问题 文章目录 【动态规划】简单多状态dp问题&#xff08;2&#xff09;买卖股票问题1. 最佳买卖股票时机含冷冻期&#xff08;买卖股票Ⅰ&#xff09;1.1 题目解析1.2 算法原理1.2.1 状态表示1.2.2 状态机1.2.3 状态转移方程1.2.4 初始化1.2.5 填表顺序1.2.6 返回值 1…

26.利用概率神经网络分类 预测基于PNN的变压器故障诊断(附matlab程序)

1.简述 学习目标&#xff1a; 概率神经网络分类预测 基于PNN的变压器故障诊断 概率神经网络是由Specht博士在1989年首先提出&#xff0c; 是一种与统计信号处理的许多概念有着紧密联系的并行算法。它实质上是一个分类器&#xff0c;根据概率密度函数的无参估计进行贝叶斯决策…

VanillaNet实战:使用VanillaNet实现图像分类(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整算法设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试热力图可视化展示…

【掌握Spring事务管理】深入理解事务传播机制的秘密

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1.Spring 中事务的实现方式 1.1 Spring 编程式…

第八十天学习记录:计算机硬件技术基础:80486微处理器的指令系统

80486微处理器的寻址方式 要使微处理器能够完成指令规定的操作&#xff0c;则指令中须包含2种信息&#xff0c;一是执行什么操作&#xff1b;二是该操作所涉及的数据在哪里&#xff1b;三是结果存于何处&#xff0c;故指令通常操作由操作码字段和操作数字组成&#xff0c;其书…

chatgpt赋能python:Python的抹零功能介绍及使用方法

Python的抹零功能介绍及使用方法 Python是一种广泛使用的编程语言&#xff0c;而其抹零功能是在进行浮点数操作时非常有用的。在本文中&#xff0c;我们将介绍python中抹零的概念、使用方法以及注意事项&#xff0c;以帮助大家更好地使用python中的抹零功能。 什么是抹零&…

【MarkDown】CSDN Markdown之时间轴图timeline详解

文章目录 时间轴图一个关于时间轴图的例子语法分组长时间段或事件文本换行时间段和事件文本样式自定义颜色方案主题基础主题森林主题黑色主题默认主题中性主题 与库或网站集成 时间轴图 时间轴图&#xff1a;现在这是一个实验性的图表。语法和属性可能会在未来版本中更改。除了…

渣土车未苫盖识别系统 yolov8

渣土车未苫盖识别系统通过yolov8python&#xff0c;渣土车未苫盖识别系统对经过的渣土车进行实时监测&#xff0c;当检测到有渣土车未能及时苫盖时&#xff0c;将自动发出警报提示现场管理人员及时采取措施。Yolo模型采用预定义预测区域的方法来完成目标检测&#xff0c;具体而…

chatgpt赋能python:Python抽人代码:如何优化你的抽奖过程?

Python抽人代码&#xff1a;如何优化你的抽奖过程&#xff1f; 简介 抽奖是在网站上进行的一项非常常见的活动。随着技术的发展&#xff0c;抽奖活动的方式也越来越多样化。在这些活动中&#xff0c;人们喜欢使用抽人软件或代码来提高效率并确保随机性。这在Python中是相当简…

chatgpt赋能python:Python查找第二大的数——从入门到实战

Python查找第二大的数——从入门到实战 Python是一门非常强大的编程语言&#xff0c;不仅支持基本的编程技巧&#xff0c;也支持各种复杂的算法和数据结构。本篇文章将介绍如何通过Python编写一个程序&#xff0c;来实现查找数组中第二大的数。 环境准备 想要运行这个程序&a…

SQL 函数:concat函数、concat_ws()函数、group_concat()

SQL 函数&#xff1a;concat函数、concat_ws()函数、group_concat()函数(转载) concat()函数 功能&#xff1a;将多个字符串连接成一个字符串。 语法&#xff1a;concat(str1, str2,…) 返回结果为连接参数产生的字符串&#xff0c;如果有任何一个参数为null&#xff0c;则返…

java - 报错解决集合

ssm-java学习笔记 java.lang.NoSuchMethodException: org.cjh.bean.Dept.<init>()Invalid bound statement (not found)错误解决方法动态sql if java.lang.IndexOutOfBoundsException: Index: 5, Size: 5Failed to determine a suitable driver classjava.sql.SQLExcepti…

第十二章 sys模块

1. sys模块介绍 什么是Python 解释器 当编写Python 代码时&#xff0c;通常都会得到一个包含Python 代码的以.py 为扩展名的文件。要运行编写的代码&#xff0c;就需要使用Python 解释器去执行.py 文件。因此&#xff0c;Python 解释器就是用来执行Python 代码的一种工具。常…