Future机制实际应用

系列文章目录


文章目录

  • 系列文章目录
  • 前言


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


常见的两种创建线程的方式。一种是直接继承Thread,另外一种就是实现Runnable接口。

这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。

从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。

Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。(因为可以异步获得执行结果,所以不用一直同步等待去获得执行结果)。
在这里插入图片描述
这里给一个实际使用的案例代码,理论是一样的,但是编码方式有多种。

关于代码的注意点和说明,都在注释里面,由于案例比较简单,这里不再啰嗦。

package com.example.springboot;
import com.alibaba.fastjson2.JSON;
import com.example.springboot.entity.User;
import com.example.springboot.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.function.Supplier;
/*** Future 机制测试*/
@SpringBootTest
public class FutureTest {@Autowiredprivate UserMapper userMapper;private static ThreadPoolExecutor pool;static {pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);}@Testpublic void test1() throws Exception {// 创建一个调用次数为2的计数工具CountDownLatch countDownLatch = new CountDownLatch(2);// 直接在异步内组装返回数据,注意List不是线程安全的,也可以采用Vector或者synchronized关键字方式List<User> listTmp = new CopyOnWriteArrayList<>();// 通过异步返回接收,因为是编码依次接收,所以不存在安全问题List<User> listRe = new ArrayList<>();// 异步执行 1CompletableFuture<User> reStrFu1 = CompletableFuture.supplyAsync(new Supplier<User>() {@Overridepublic User get() {try {Thread.sleep(2000);// 获取结果方式1,直接组装到上层方法变量中User user = userMapper.selectById(1);listTmp.add(user);return user;}catch (Exception e){e.printStackTrace();}finally {countDownLatch.countDown(); // 异步执行结束}return null;}}, pool);// 异步执行 2CompletableFuture<User> reStrFu2 = CompletableFuture.supplyAsync(new Supplier<User>() {@Overridepublic User get() {try {Thread.sleep(2000);// 获取结果方式1,直接组装到上层方法变量中User user = userMapper.selectById(2);listTmp.add(user);return user;}catch (Exception e){e.printStackTrace();}finally {countDownLatch.countDown(); // 异步执行结束}return null;}}, pool);//        // 获取结果方式2,带超时的参数
//        listRe.add(reStrFu1.get(10, TimeUnit.SECONDS)); // 可以定义获取超时时间
//        listRe.add(reStrFu2.get(10, TimeUnit.SECONDS)); // 可以定义获取超时时间// 获取结果方式3,等待计数结束try {countDownLatch.await();} catch (Exception e) {e.printStackTrace();}listRe.add(reStrFu1.get());listRe.add(reStrFu2.get());System.out.println("listTmp" + JSON.toJSONString(listTmp));System.out.println("listRe" + JSON.toJSONString(listRe));}
}

最后打印结果是一样的,都是两条数据的JSON。

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

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

相关文章

vue-office/docx插件实现docx文件预览

1.下包 //预览docx文件 npm install vue-office/docx vue-demi//如果是vue2.6版本或以下还需要额外安装 vue/composition-api2.引入 <template><div>//在src填入文档地址<VueOfficeDocx srchttp://...../xx.docx style"width:80%" rendered"re…

决策树学习心得

在数据科学与机器学习的领域中&#xff0c;决策树是一个经久不衰的经典算法。它以其直观性、易解释性和强大的分类能力而受到广泛关注。在深入学习决策树的过程中&#xff0c;我不仅对其算法原理有了更深入的理解&#xff0c;还体会到了它在实际应用中的巨大潜力。 一、初识决…

C++ 3.25作业

1、定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream>using namespace std;namesp…

如何从外网访问内网服务器?

在网络通信中&#xff0c;内网服务器指的是位于私有网络内部的服务器&#xff0c;它们可以提供各种服务&#xff0c;如网站、应用程序等。由于安全性的考虑&#xff0c;内网服务器通常无法直接从外部网络访问。本文将介绍如何通过使用【天联】组网来实现从外网访问内网服务器的…

基于Spring Boot+Vue的美食推荐商城系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

Element-Plus下拉菜单边框去除教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

2016年认证杯SPSSPRO杯数学建模C题(第二阶段)如何有效的抑制校园霸凌事件的发生全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现&#xff1a; 近年来&#xff0c;我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的&#xff0c;因此对于这些情况我们应该…

【笔试】美团2023年秋招第1场笔试(后端数开软件方向)

文章目录 T1 小美玩排列T2 小美走公路T3 小美切蛋糕T4 小美将字符串平铺成矩阵T5 小美染色 23秋招&#xff0c;美团笔试1&#xff08;技术&#xff09; 美团2024届秋招笔试第一场编程真题 时间&#xff1a;2023.08&#xff0c;牛客补题 美团是少有的整份卷子5题都是算法题的&…

【Unity】调整Player Settings的Resolution设置无效

【背景】 Build时修改了Player Settings下的Resolution设置&#xff0c;但是再次Building时仍然不生效。 【分析】 明显是沿用了之前的分辨率设定&#xff0c;所以盲猜解决办法是Build相关的缓存文件&#xff0c;或者修改打包名称。 【解决】 实测修改版本号无效&#xf…

maya常用技巧

目录 打开脚本编辑器 打开脚本编辑器 打开Maya软件后&#xff0c;从窗口菜单栏选择“General Editors”&#xff0c;再选择“Script Editor”&#xff0c;即可打开Maya的脚本编辑器。这是最基本的打开方式&#xff0c;适用于大多数用户。 二、使用快捷键打开 在Maya的快捷键…

每天30分钟python(第一天)

1.input 1.规则 input输入的是字符串 2.print打印规则&#xff1a; 整数不能与文字一起打印&#xff0c;但是字符串可以&#xff0c;所以将文字转换为字符串即可 print("小明今年"str(5)"岁了") 代码实践&#xff1a; 错误代码&#xff1a; # 实现 …

Qt实现TFTP Server和 TFTP Client(二)

3 实现 3.1 Core Core模块包括下面4个类&#xff1a; TFTPBaseUdpTFtpClientFileTFtpServerFile 3.1.1 TFTP TFTP类实现了TFTP协议。 3.1.1.1 TFTP定义 class TFtp { public:TFtp();enum Code {RRQ 0x0001,//Read requestWRQ 0x0002,//Write requestDATA 0x0003…

Windows服务器性能监控

Windows服务器操作系统设计用于运行在客户端-服务器架构内的服务器上&#xff0c;这些服务器通常设计用于处理繁重的工作负载&#xff0c;并作为企业中涉及的大多数软件操作的骨干。因此&#xff0c;为了防止由于性能问题而导致的任何服务损失并保持操作的无缝流&#xff0c;Wi…

如何评价代码质量

设计模式专栏&#xff1a; http://t.csdnimg.cn/4Mt4u 目录 1.引言 2.可维护性(maintainability) 3.可读性(readability) 4.可扩展性(extensibility) 5.灵活性(flexibility) 6.简洁性(simplicity) 7.可复用性(reusability) 8.可测试性(testability) 9.总结 1.引…

Linux-进程控制(进程创建、进程终止、进程等待)

一、进程创建 1.1 fork函数介绍 在命令行下我们可以通过 ./ exe文件 来创建一个进程&#xff0c;通过fork函数&#xff0c;我们可以通过代码的形式从一个进程中创建一个进程&#xff0c;新进程为子进程&#xff0c;原进程为父进程&#xff0c;子进程在创建时&#xff0c;会与…

教育建筑智慧能源管理平台解决方案【新型电力系统下的绿色校园能源管理平台】

一、行业特点 1.建筑类型多&#xff1a;集教学、科研、生活于一体&#xff0c;占地面积大&#xff0c;建筑类型多&#xff0c;功能划分复杂。 2.供电可靠性要求高&#xff1a;教育建筑中的高层建筑、图书馆、实验楼等特级和一级负荷比较多&#xff0c;一旦发生故障会危及生命…

STM32 ESP8266模块的曲折探索

这是本文的配套资料&#xff0c;最终工程请参考 新_ESP8266资料\stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 一、等到了ready 产品参数 我使用的是ai-thinker的esp8266-01s&#xff0c;以下为产品规格书 引脚定义&#xff1a; 依据引脚定义&…

ssh -p 2222怎么进docker容器

要通过SSH和端口2222进入Docker容器&#xff0c;您需要确保容器内已经安装并运行了SSH服务器&#xff0c;并且已经将宿主机的2222端口映射到容器的SSH端口&#xff08;通常为22&#xff09;。以下是一般的步骤&#xff1a; 1、启动容器时映射端口&#xff1a; 当您启动容器时…

android studio忽略文件

右键文件&#xff0c;然后忽略&#xff0c;就不会出现在commit里面了 然后提交忽略文件即可

Linux查询日志常用命令整理

Linux查询日志常用命令整理 1. 实时查看日志2. 查看历史日志的最后几行3. 根据关键词过滤日志4. 查询指定路径下的所有日志文件5. 当日志文件过大时&#xff0c;查看开头部分6. 筛选出指定时间范围内的日志7. 分页查看日志8. 将查询到的日志输出到另一个文件9. 查看过去某一时间…