CompletableFuture保证线程同步
目的:多线程执行某些任务,把执行完的结果放到list中,最后返回list。
1、list要保证线程安全
2、要等所有的线程都执行完,才能返回list
3、异常处理,若其中某个线程出现了异常,会导致其线程卡死,必须进行try-catch包裹
package com.thread; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; public class ThreadPoolTest {
public static ThreadPoolExecutor pool = new ThreadPoolExecutor(
5,10,200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10)); public static void main(String[] args) {
// 写加锁,读不加锁
List<String> list = new CopyOnWriteArrayList<>();
List<CompletableFuture> cfs = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Map<String, Integer> params = new HashMap<>();
params.put("i", i);
CompletableFuture cf = CompletableFuture.runAsync(() -> {
try {
String value = String.format("thread: %s, i = %s", Thread.currentThread().getName(), params.get("i"));
System.out.println(value);
list.add(params.get("i").toString());
} catch(Exception e) {
// 在不能保证代码一定不会出现异常的情况下,必须进行try-catch处理
}
}, pool);
cfs.add(cf);
}
// 等待所有线程执行完
CompletableFuture.allOf(cfs.toArray(new CompletableFuture[1])).join();
System.out.println(list);
pool.shutdown();
}
}
runAsync类似于execute方法,不支持返回值,而supplyAsync方法类似submit方法,支持返回值。
没有指定Executor的方法会使用ForkJoinPool.commonPool() 作为它的线程池执行异步代码。
CompletableFuture保证线程同步的更多相关文章
- mfc通过信号量保证线程同步
1.声明一个全局handle,记住在cpp里也声明 extern HANDLE uiHandle; 2.创建信号量 uiHandle = CreateSemaphore(NULL,1,1,NULL); ...
- Java多线程 3 线程同步
在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...
- Java多线程——线程同步
在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...
- 【转】多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对 ...
- Java分享笔记:创建多线程 & 线程同步机制
[1] 创建多线程的两种方式 1.1 通过继承Thread类创建多线程 1.定义Thread类的子类,重写run()方法,在run()方法体中编写子线程要执行的功能. 2.创建子线程的实例对象,相当于 ...
- Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信
1.Java使用Thread类代表线程. 所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...
- iOS开发系列-线程同步技术
概述 多线程的本质就是CPU轮流随机分配给每条线程时间片资源执行任务,看起来多条线程同时执行任务. 多条线程同时访问同一块资源,比如操作同一个对象.统一变量.同一个文件,就会引发数据错乱和数据安全的问 ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- C# 线程同步的三类情景
C# 已经提供了我们几种非常好用的类库如 BackgroundWorker.Thread.Task等,借助它们,我们就能够分分钟编写出一个多线程的应用程序. 比如这样一个需求:有一个 Winform ...
- Delphi多线程的OnTerminate属性(附加一个关于临界区线程同步的例子)
首先看TThread源码中关于OnTerminate的代码: public .... property OnTerminate: TNotifyEvent read FOnTerminate writ ...
随机推荐
- vue2鼠标事件
1.单击 @click 2.按下 @mousedown 3.抬起 @mouseup 4.双击 @dblclick 5.移动 @mousemove 6.移除 @mouseout 7.离开 @mousel ...
- Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提效!
前言 今天大姚带领大家一起来看看 Visual Studio 2022 v17.13 新版发布都更新了哪些新功能,为我们开发工作带来了哪些便利,是否真的值得我们花费时间把 Visual Studio ...
- Java 中常见的垃圾收集器有哪些?
Java 中常见的垃圾收集器 Java 提供了多种垃圾收集器(Garbage Collector, GC),每种收集器针对不同的应用场景和需求进行了优化.以下是常见的垃圾收集器及其特点. 1. Ser ...
- 基于CNN(卷积神经网络)的车牌号识别【结尾附完整项目下载地址】
基于卷积神经网络(CNN)的车牌识别技术是一种深度学习方法,用于自动检测并识别车辆的车牌号码.以下是经过优化后的处理步骤: 图像预处理:首先对获取的车牌图像进行处理,包括将其转换为灰度图.二值化处理以 ...
- Python3爬虫批量爬取图片并保存到本地
看新闻的时候忽然发现了一个图片网站,那肯定得爬一下. 网址:https://www.0xu.cn/ 不难发现,qcmn这个路径对应青春美女 右键检查图片地址可见 访问该地址成功访问到了图片 正式开始 ...
- SpringBoot3特性——错误信息Problemdetails
Spring Framework 6 实现了 HTTP API 规范 RFC 7807 的问题详细信息. 在本文中,我们将学习如何在 SpringBoot 3 REST API(使用 Spring F ...
- Linux命令之剪切
一.格式 mv source dest 二.介绍 mv: 命令 source: 源文件 dest: 目的地址 三.案例 剪切conf 文件到 /home/data 文件下 目前conf 文件是在/h ...
- HarmonyOS Next实战教程:实现中间凹陷的异形tabbar
今天要和大家分享的实战案例是实现中间凹陷的tabar 前些天在做墨迹天气的时候看到了这种异形的tabbar,看起来比较有挑战性,因为鸿蒙版的墨迹天气app还没有这个东西,我决定尝试做一下. 系统的Ta ...
- Google Cloud Next大会上的耀眼新星:探索最具潜力的AI初创公司
在拉斯维加斯举办的Google Cloud Next大会上,不仅揭晓了如Ironwood处理器和Gemini 2.5 Flash等重磅新技术,还展示了一系列使用谷歌云计算服务的最有趣的初创公司.这些创 ...
- codeup之有序插入
Description 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中. 假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按 ...