使用CompletableFuture遇到的一个小坑

news2024/12/22 10:53:03

在使用CompletableFuture时,发现获取数据时,有时候数据获取不到(值为null)。

代码如下:

package com.example.mavendemo.completablefuture;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.*;

/**
 * @ClassName NullTest.java
 * @Description
 * @Author chengjiangbo@xinxuan.net
 * @DateTime 2024/8/15 11:14
 * @Version 1.0
 */
@Slf4j
public class NullTest {

    public static void main(String[] args) {
        new NullTest().test();
    }

    public void test()  {
        //自定义线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.CallerRunsPolicy());


        List<Integer> safeList = new ArrayList<>();

        List<Integer> numbers = Arrays.asList(0, 10, 20, 30, 40);

        List<CompletableFuture> completableFutures =  Lists.newArrayList();
        for (int i = 0; i < 5; i++) {
            int finalI = i;
            CompletableFuture completableFuture = CompletableFuture.runAsync(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Integer value = numbers.get(finalI);
                safeList.add(value * value);
                log.info("异步线程=======>" + Thread.currentThread().getName() + ":" + System.currentTimeMillis());
            }, executor);

            completableFutures.add(completableFuture);
        }

        CompletableFuture<Void> allFuture = CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()]));
        try{
            allFuture.get();
        } catch (Exception e){
            e.printStackTrace();
        }

        safeList.stream().forEach(System.out::println);

        //关闭线程池
        executor.shutdown();
    }
}

获取不正常的结果如下:

经过排查发现是居然是List集合的线程安全的问题导致:

//        List<Integer> safeList = new ArrayList<>();
        //注意,一定要使用线程安全的集合放置值,否组会出现线程安全问题,导致部分数据丢失
        CopyOnWriteArrayList<Integer> safeList = new CopyOnWriteArrayList();

再次运行多遍均获得正确结果:

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

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

相关文章

STM32第十二节(中级篇):串口通信(第一节)——功能框图讲解

前言 我们在51单片机中就已经学习过了串口通信的相关知识点&#xff0c;那么我们现在在32单片机上进一步学习通信的原理。我们主要讲解串口功能框图以及串口初始化结构体以及固件库讲解。 STM32第十二节&#xff08;中级篇&#xff09;&#xff1a;串口通信&#xff08;第一节…

免费的泛域名SSL证书如何申请

申请免费泛域名SSL证书的新指南 1. 选择合适的证书颁发机构 首先&#xff0c;寻找一个提供免费泛域名SSL证书的证书颁发机构&#xff08;CA&#xff09;。JoySSL是目前最知名的免费证书提供商之一&#xff0c;它支持泛域名证书&#xff0c;允许您为单个域名及其所有子域名提供…

【图像特效系列】图像的各种特效处理 | 图像素描特效的实践

目录 一 图像素描特效 实践① 实践② 图像特效系列主要是对输入的图像进行处理,生成指定特效效果的图片。图像素描特效会将图像的边界都凸显出来;图像怀旧特效是指图像经历岁月的昏暗效果;图像光照特效是指图像存在一个类似于灯光的光晕特效,图像像素值围绕光照中心点呈…

mac要装虚拟机吗

在Mac上安装虚拟机可以带来多种好处&#xff0c;‌但同时也存在一些潜在的影响。‌ 首先&#xff0c;‌虚拟机技术允许在同一设备上运行多个操作系统&#xff0c;‌这对于需要测试不同操作系统兼容性的开发者和IT专业人员来说非常有用。‌此外&#xff0c;‌虚拟机还能解决软件…

[星瞳科技]如何用OpenMV制造一个可以追小球的云台?

材料 你需要以下东西&#xff1a; OpenMV3D打印件 (在pantilt/stl下载)pcb固定板(pantilt/eagle下载)2个微型舵机一个锂电池 连接 按照上图连接。 资料下载 主要都在github上&#xff0c;可以点击查看下载&#xff1a;OpenMV-Pan-Tilt/pan-tilt/src at master SingTown/…

苹果手机qq文件怎么恢复?4个方法快速搞定

在日常生活中&#xff0c;我们经常通过QQ来传输和接收各种文件&#xff0c;无论是工作文档还是珍贵的照片&#xff0c;这些文件都承载着重要的信息和记忆。 然而&#xff0c;我们有时会不小心删除了这些宝贵的QQ文件。面对这样的困境&#xff0c;QQ文件怎么恢复&#xff1f;本…

轻空间成功承建上海浦东川沙镇气膜游泳馆

近期&#xff0c;轻空间&#xff08;江苏&#xff09;膜结构科技有限公司顺利完成了上海浦东川沙镇气膜游泳馆的建设工作。作为轻空间在体育设施领域的又一重要项目&#xff0c;这一游泳馆的成功落成&#xff0c;充分展现了轻空间在气膜结构建筑设计与施工方面的卓越技术和丰富…

W31-02-excel和logging使用,实现自动登录百度,并搜索雷军

接上文&#xff1a;W31-01&#xff0c;本文改为使用excel驱动实现数据驱动维护自动化数据&#xff0c;实现数据与代码分离&#xff0c;主要知识点如下&#xff1a; 1.使用excel相关功能&#xff1a; pip install openyxl -i https://pypi.tuna.tsinghua.edu.cn/simple 2.反…

机器学习——支持向量机(SVM)(1)

目录 一、认识SVM 1. 基本介绍 2. 支持向量机分类器目标 二、线性SVM分类原理&#xff08;求解损失&#xff09; 三、重要参数 1. kernel&#xff08;核函数&#xff09; 2 .C&#xff08;硬间隔与软间隔&#xff09; 四、sklearn中的支持向量机&#xff08;自查&#…

HTTPS安全吗?来看看HTTPS有多安全

从保护银行网站到在线购物期间保护数据&#xff0c;HTTPS协议在互联网上随处可见。例如当您访问racent.com时&#xff0c;你会发现你是通过安全加密链接来访问网站的。这种安全链接会触发浏览器的网址栏旁边显示安全挂锁图标。 但HTTPS真的安全吗&#xff1f; 如果你想快速得…

【算法速刷(7/100)】LeetCode —— 200.岛屿数量

这题是典型的深搜题&#xff0c;只需要额外记录每个格子是否被搜索过&#xff0c;然后挨个进行陆地的深度搜索即可。&#xff08;如果要使用lambda进行递归&#xff0c;需要显式指出变量的模板类型&#xff0c;不能使用auto推导&#xff09; int numIslands(vector<vector&…

vue+ckEditor5 复制粘贴wold文字+图片并保存格式

第一步在vue2项目下安装 npm install --save ckeditor/ckeditor5-build-decoupled-document 第二 项目下新建一个plugins的文件夹将这个包ckeditor5-build-classic放入 &#xff08;包在页面最上方 有个下载按钮 可以下载&#xff09; 刚开始时 ckeditor5-build-classic文件…

ai人工智能伪原创,文章伪原创的不二选择

文章伪原创我们可以通过人工手动去完成&#xff0c;也可以通过伪原创工具去完成&#xff0c;但随着技术的发展&#xff0c;越来越多的人在做文章伪原创处理时都不再选择人工低效率的去完成&#xff0c;而是选择用ai人工智能伪原创工具实现自动完成&#xff0c;这不仅能提升文章…

百元护眼台灯哪家强?看书客、孩视宝和飞利浦护眼台灯哪个好?

护眼台灯顾名思义有着“护眼”功能&#xff0c;因此收到许多家庭的喜爱&#xff0c;许多家长纷纷给孩子选购一台护眼台灯以达到保护视力健康的效果。然而&#xff0c;随着护眼台灯的爆红&#xff0c;市面上大多数护眼灯质量良莠不齐&#xff0c;有着做工粗糙、劣质灯珠导致视力…

面试必备之——TCP/UDP(一)

OSI七层模型、TCP/IP四层五层模型 &#xff08;.森木磊石&#xff09;&#xff08;金美&#xff09; 1、应用层&#xff1a;&#xff08;七层变为三层&#xff09;是用户与网络的交互层&#xff0c;负责提供各种应用程序和服务。协议例如HTTP、FTP、TFTP等。 应用层&#xff1…

同城便民生活小程序源码系统 二手市场+求职招聘+招聘信息 到源码包以及搭建教程

系统概述 同城便民生活小程序源码系统&#xff0c;是一款专为满足城市居民日常需求而设计的综合服务平台。该系统集成了二手市场、求职招聘、招聘信息三大核心模块&#xff0c;旨在通过数字化手段&#xff0c;优化资源配置&#xff0c;促进信息流通&#xff0c;让城市居民的生…

密码学基础:彩虹表技术

文章目录 一、前期准备1.1 前缀知识1.2 工具准备 二、彩虹表技术2.1 什么是彩虹表&#xff1f;2.2 彩虹表预先计算的散列链原理2.3 其他通过加密摘要攻击用户密码的技术2.4 彩虹表存储规格2.6 彩虹表生成、排序、合并和转换命令 三、彩虹表攻击示例3.1 安装 rainbowcrack3.2 生…

Git是如何工作的

Git 是一个分布式的版本控制系统&#xff0c;这意味着它使用多个本地存储库&#xff0c;包括一个集中式存储库和服务器&#xff0c;它在从前端工作中抽象出底层机制方面做得非常出色。虽然 Git 已经演变成一个成熟的版本控制管理系统&#xff0c;但这并不是作者最初的意图&…

网络硬盘录像机NVR程序源码和NVR模组展示及设备开机配置和主界面使用介绍

NVR软硬一体机支持录像设置&#xff0c;还具有录像回放、录像备份和报警设置等多种功能。接下来&#xff0c;我们首先看一下硬件连接&#xff0c;并开机后的基础配置操作。 NVR的优势&#xff08;包括不限于&#xff09;&#xff1a; 1.支持录像回放 支持设置冗余录像&#…

Java开发中使用腾讯云OCR进行身份证识别与COS云存储实践

文章目录 完整代码代码讲解总结 在Java开发中&#xff0c;处理身份证识别和云存储是一项常见的需求&#xff0c;尤其是在需要用户身份验证的应用场景中。今天&#xff0c;我想和大家分享一个实际的案例&#xff0c;展示如何利用腾讯云的OCR服务进行身份证识别&#xff0c;并将识…