企业级微服务架构实战项目--xx优选-详情页面的异步调用completablefuture

news2024/11/17 6:52:54

一  常见的调用方式

1.1 并发

并发:同一时刻多个线程在访问同一个资源,多个线程对一个点

​ 例子:春运抢票、微信抢红包、电商秒杀...

1.2 同步串行

代表多任务按先后顺序执行,并且都是同一个线程来执行。

1.3 异步串行

代表多任务按先后顺序执行,并由不同的线程来执行。

 

 1.4 并行

多项任务一起执行,之后再汇总

例子:泡方便面,电水壶烧水,一边撕调料倒入桶中

 1.5 任务合并

一个任务的执行依赖于前面多个任务执行的返回值,并且这些任务可以由同一个线程执行,也可以由不同的线程执行;

 1.6 多线程的4种范式

第一种 继承Thread类

第二种 实现Runnable接口

第三种 使用Callable接口

第四种 使用线程池

二  completableFuture实现

2.1 作用

CompletableFuture异步编排,CompletableFuture和FutureTask同属于Future接口的实现类,都可以获取线程的执行结果。

2.2  runAsync方法没有返回值

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo1 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        System.out.println("main begin....");
        CompletableFuture<Void> completableFuture =
                CompletableFuture.runAsync(()->{
                    System.out.println("当前线程:"+Thread.currentThread().getId());
                    int result = 1024;
                    System.out.println("result:"+result);
                },executorService);
        System.out.println("main over....");
    }
}

2.3  supplyAsync 方法有返回值

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo2 {
    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        System.out.println("main begin....");
        CompletableFuture<Integer> completableFuture =
                CompletableFuture.supplyAsync(()->{
                    System.out.println("当前线程:"+Thread.currentThread().getId());
                    int result = 1024;
                    System.out.println("result:"+result);
                    return result;
                },executorService);
        //获取返回结果
        Integer value = completableFuture.get();
        System.out.println("main over...."+value);
    }
}

2.4 计算完成时回调方法

whenComplete可以处理正常或异常的计算结果,exceptionally处理异常情况。

whenComplete 和 whenCompleteAsync 的区别:

whenComplete:是执行当前任务的线程执行继续执行 whenComplete 的任务。

whenCompleteAsync:是执行把 whenCompleteAsync 这个任务继续提交给线程池来进行执行。

方法不以Async结尾,意味着Action使用相同的线程执行,而Async可能会使用其他线程执行(如果是使用相同的线程池,也可能会被同一个线程选中执行)

public class Demo3 {
    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        System.out.println("main begin....");
        CompletableFuture<Integer> completableFuture =
                CompletableFuture.supplyAsync(()->{
                    System.out.println("当前线程:"+Thread.currentThread().getId());
                    int result = 10/0;
                    System.out.println("result:"+result);
                    return result;
                },executorService)
                        .whenComplete((rs,exception)->{
                            System.out.println("结果:"+rs);
                            System.out.println(exception);
                        });
        System.out.println("main over....");
    }
}

2.5 线程串行化方法

1.thenApply 方法:当一个线程依赖另一个线程时,获取上一个任务返回的结果,并返回当前任务的返回值。

2.thenAccept方法:消费处理结果。接收任务的处理结果,并消费处理,无返回结果。

3henRun方法:只要上面的任务执行完成,就开始执行thenRun,只是处理完任务后,执行 thenRun的后续操作

带有Async默认是异步执行的。这里所谓的异步指的是不在当前线程内执行

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo4 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        // 线程1执行返回的结果:100
        CompletableFuture<Integer> futureA =
                CompletableFuture.supplyAsync(() -> {
                    int res = 100;
                    System.out.println("线程一:"+res);
                    return res;
                });

        // 线程2 获取到线程1执行的结果
        CompletableFuture<Integer> futureB = futureA.thenApplyAsync((res)->{
            System.out.println("线程二--"+res);
            return ++res;
        },executorService);

        //线程3: 无法获取futureA返回结果
        CompletableFuture<Void> futureC = futureA.thenRunAsync(() -> {
            System.out.println("线程三....");
        }, executorService);
    }
}

2.6 多任务组合

allOf:等待所有任务完成

anyOf:只要有一个任务完成

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo5 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        // 线程1
        CompletableFuture<Integer> futureA =
                CompletableFuture.supplyAsync(() -> {
                    System.out.println(Thread.currentThread().getName()+"--begin..");
                    int res = 100;
                    System.out.println("一:"+res);
                    System.out.println(Thread.currentThread().getName()+"--over..");
                    return res;
                },executorService);

        // 线程2
        CompletableFuture<Integer> futureB =
                CompletableFuture.supplyAsync(() -> {
                    System.out.println(Thread.currentThread().getName()+"--begin..");
                    int res = 30;
                    System.out.println("二:"+res);
                    System.out.println(Thread.currentThread().getName()+"--over..");
                    return res;
                },executorService);

        CompletableFuture<Void> all = CompletableFuture.allOf(futureA,futureB);
        all.get();
        System.out.println("over....");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689632.html

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

相关文章

【Java面试题】Java基础语法

文章目录 JDK、JRE和JVM的关系栈和堆分别存的什么数据异步和同步线程和进程区别java的数据类型有哪些equals和HashCode重写的问题?深拷贝和浅拷贝的区别和equals的区别常见的运行时异常有哪些&#xff1f; JDK、JRE和JVM的关系 JDK、JRE和JVM的关系&#xff1a; JDK(Java De…

数据库监控与调优【一】—— 数据库调优的维度

数据库调优的维度 左边是千金良方的&#xff0c;右边是个人优化的 业务需求 不合理的需求&#xff0c;可能会造成很多问题勇敢地对不合理的需求说不拨乱反正&#xff0c;把不合理的需求变成合理的需求 例子 财务SaaS系统&#xff0c;财务领域有种叫做代账的概念&#xff0c…

uniapp+vue3+vite+ts+uviewPlus搭建项目

创建项目架构 首先使用官方提供的脚手架创建一个项目&#xff0c;这里我创建的 vue3 vite ts 的项目&#xff1a; npx degit dcloudio/uni-preset-vue#vite-ts project-name&#xff08;如命令行创建失败&#xff0c;请直接访问 giteehttps://gitee.com/dcloud/uni-preset-vu…

2023-06-20 x-ui-服务器配置记录

基础软件: yum update -y yum install -y curl yum install -y socat 工作软件: bash <(curl -Ls https://raw.githubusercontent.com/sprov065/x-ui/master/install.sh) 设置: 参考: 使用云服务器搭建代理-腾讯云开发者社区-腾讯云

9 HAL库驱动框架简述

目录 HAL库驱动框架简述 HAL库外设设计思想 HAL库和Cube MX相结合 一、对外设的封装——句柄结构体 二、外设初始化 初始化结构体 初始化的逻辑 三、外设使用逻辑 通用接口函数 初始化函数 I/O操作函数 控制函数 状态参数 扩展接口函数 总结 补充&#xff1a;H…

算法拾遗三十四线段树

算法拾遗三十四线段树 线段树说明物理结构使用线段树落方块的问题 线段树说明 给定固定长度的数组&#xff0c;然后要在数组给定的范围内完成加法【如数组1&#xff0c;200下标元素加6】&#xff0c;更新【7&#xff0c;375范围数组元素更新为4】&#xff0c;查询操作【查询3到…

【云原生丶Docker】Docker镜像加速器:给冰山提提速!

Docker镜像加速器是一种用于加速Docker镜像下载和构建的工具。它可以提高Docker镜像的下载速度&#xff0c;从而加快应用程序的开发和部署速度。 Docker镜像加速器通常使用CDN(内容分发网络)技术来实现加速。CDN是一种分布式网络架构&#xff0c;可以将内容缓存在全球各地的服务…

命令行--git--多次commit如何合并成一个commit

参考:https://blog.csdn.net/qq_50652600/article/details/120800309 在我们平时开发中&#xff0c;我们提交代码免不了要和git打交道&#xff0c;那么我们肯定是先从预发分支上&#xff08;公司一般都用pre命名&#xff0c;这里为了方便演示用master&#xff09;上拉去最新的代…

测试工程师首用chatGPT,编写python读取xmind测试用例chatgtp+python+xmind

背景 有用xmind写测试用例的吧&#xff0c;统计一个xmind的条&#xff0c;需要花大量的时间&#xff0c;还有要统计有多少条冒烟的&#xff0c;多少条不通过的&#xff0c;还有通过的条数。 需求 快速使用python&#xff0c;写一个简单的脚本&#xff0c;统计所有xmind节点&…

FPGA_学习_09_PWM呼吸灯

PWM在三相电机控制中&#xff0c;有着非常重要的地位。 如果你需要用FPGA去实现三相电机的控制&#xff0c; PWM这一关是绕不过的。好在PWM的基本原理是比较简单的。所以原理部分本文就略过&#xff0c;本文基于PWM实现呼吸灯。 1 时序 {signal: [{name: clk, wave: p....…

4 STM32启动过程(以Cortex-M3为例)(保姆级介绍)

设计知识点补充在前&#xff1a; 1.关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解 参考见 关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解_Vincent_Song的博客-CSDN博客 2.哈佛结构和冯诺依曼结构的区别…

vue2中左侧菜单和头部tab标签联动

效果图 我这里是使用的vue2 element-ui来实现的&#xff0c;代码可以直接拿来使用 一、首先先安装element-ui element-ui官网 npm i element-ui -S 然后在main.js里面配置&#xff0c;安装官网的步骤来就可以了&#xff0c;这里就不一一介绍了 import Vue from vue; impor…

用wget等命令行工具下载Jenkins上的文件

背景 现在一般公司的内部CI系统都用Jenkins实现&#xff0c;本地部署的时候我会将待测试文件下载到本地&#xff0c;再上传到Linux开发板&#xff0c;但能否从Linux开发板直接下载呢&#xff1f;只要Linux与Jenkins server之间的网络是联通的&#xff0c;那就可以 解决方法 …

【从零开始学习JAVA | 第二十三篇】集合体系结构

目录 前言&#xff1a; 单列集合&#xff1a; set与list的区别&#xff1a; 双列集合&#xff1a; map的特点&#xff1a; 总结&#xff1a; 前言&#xff1a; JAVA中为我们提供了很多集合&#xff0c;这些集合都有自己很独特的特点&#xff0c;因此我们要学习所有的…

网络安全合规-网络安全工程师发展前景(三)

上海网络安全工程师工资按工作经验统计&#xff0c;其中应届毕业生工资5250&#xff0c;0-2年工资8910&#xff0c;3-5年工资11330&#xff0c;8-10年工资13500&#xff0c;6-7年工资16170&#xff0c;该数据仅供参考。 北京网络安全工程师工资按工作经验统计&#xff0c;其中…

python selenium 定位鼠标悬浮后的新弹窗数据

背景 最近需要获取网页上的标签数据&#xff0c;但是标签大于3个以后是隐藏的&#xff0c;需要鼠标hover上去才显示。如下图&#xff0c;图一是刚进来界面展示的&#xff0c;需要知道额外的7个标签则需要将鼠标移动到目标上面去。 但是比较尴尬的一个点是&#xff0c;当游览器打…

数据结构C语言版本(中)

第四章 串 串&#xff1a;限定数据元素类型的线性表。 应用实例&#xff1a; 编辑软件(本质上是字符串处理) 信息检索、病毒查找(字符串比较) 第一节 逻辑结构 一、定义 串是由字符组成的线性表。 STRING(D&#xff0c;S&#xff0c;P) D {ai| ai∈CHARACTER(字符集), i0,1…

Verilog基础之八、多路选择器实现

一、前言 选择器在FPGA中是基础的组成部分&#xff0c;英文全称为Multiplexer&#xff0c;为一个多输入单输出的结构。以器件xc7k480tffv1156为例&#xff0c;在slice中&#xff0c;也可以看到F7AMUX&#xff0c;F8MUX&#xff0c;这两个MUX都是二输入单输出的选择器。 二、工程…

【雕爷学编程】Arduino动手做(128)---2路I2C电平转换模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

VR虚拟现实技术为机械专业教学带来新思路

随着虚拟现实技术的发展&#xff0c;VR已经成为机械专业教学的一种新方式。它可以为学生提供更加生动、直观的学习体验&#xff0c;同时也可以帮助教师更好地进行教学和评估。以下是广州华锐互动总结的一些常见的应用场景&#xff1a; 模拟实验和操作&#xff1a;VR可以为学生提…