目的:多线程执行某些任务,把执行完的结果放到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保证线程同步的更多相关文章

  1. mfc通过信号量保证线程同步

    1.声明一个全局handle,记住在cpp里也声明 extern HANDLE uiHandle; 2.创建信号量 uiHandle = CreateSemaphore(NULL,1,1,NULL); ...

  2. Java多线程 3 线程同步

    在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...

  3. Java多线程——线程同步

    在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...

  4. 【转】多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

    本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对 ...

  5. Java分享笔记:创建多线程 & 线程同步机制

    [1] 创建多线程的两种方式 1.1 通过继承Thread类创建多线程 1.定义Thread类的子类,重写run()方法,在run()方法体中编写子线程要执行的功能. 2.创建子线程的实例对象,相当于 ...

  6. Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信

    1.Java使用Thread类代表线程.     所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...

  7. iOS开发系列-线程同步技术

    概述 多线程的本质就是CPU轮流随机分配给每条线程时间片资源执行任务,看起来多条线程同时执行任务. 多条线程同时访问同一块资源,比如操作同一个对象.统一变量.同一个文件,就会引发数据错乱和数据安全的问 ...

  8. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  9. C# 线程同步的三类情景

    C# 已经提供了我们几种非常好用的类库如 BackgroundWorker.Thread.Task等,借助它们,我们就能够分分钟编写出一个多线程的应用程序. 比如这样一个需求:有一个 Winform ...

  10. Delphi多线程的OnTerminate属性(附加一个关于临界区线程同步的例子)

    首先看TThread源码中关于OnTerminate的代码: public .... property OnTerminate: TNotifyEvent read FOnTerminate writ ...

随机推荐

  1. c#生成一个某文本中不包含的随机字符串

    //生成一个某文本中不包含的随机字符串 private static string GetRandomStr(string allStr) { int number; string resStr; d ...

  2. 一文速通Python并行计算:06 Python多线程编程-基于队列进行通信

    一文速通 Python 并行计算:06 Python 多线程编程-基于队列进行通信 摘要: 队列是一种线性数据结构,支持先进先出(FIFO)操作,常用于解耦生产者和消费者.慢速生产-快速消费场景中,队 ...

  3. 康谋分享 | 数据隐私和匿名化:PIPL与GDPR下,如何确保数据合规?(二)

    在上期数据隐私和匿名化系列文章中,我们主要分享了<中国个人信息保护法>(PIPL)和<欧盟通用数据保护条例>(GDPR)在涵盖范围.定义.敏感信息等方面的异同点,今天,我们将重 ...

  4. PHP 实现微信异步回调数据打印知识分享

    一.引言 在微信支付.微信公众号消息推送等场景中,微信服务器会通过异步回调的方式将处理结果发送给我们的服务器.为了便于调试和监控,我们需要获取并打印这些回调数据.本文将详细介绍如何使用 PHP 的 f ...

  5. Linux限制可通过SSH登录到服务器的IP——hosts.allow

    Linux服务器针对固定的IP进行禁止.允许登录 linux 服务器通过设置/etc/hosts.allow和/etc/hosts.deny这个两个文件进行限制. 优先级:hosts.allow大于h ...

  6. ZBrush2025.1.3 中文版【ZBrush2025版下载】附安装教程

    通过网盘分享的文件:Zbrush软件安装包下载链接: https://pan.baidu.com/s/1BXzRmKUuO1ABpxA124u3mg?pwd=6666 提取码: 6666 ZBrush ...

  7. RandomWalk随机游走

    RandomWalk随机游走: 在自然界,物理学,生物学,化学,经济学等众多领域,随机游走都有实际的用途,例如,其可以描述一个漂浮在水滴上的花粒因受到水分子的作用力而在水滴表面随机移动.诸如此类的不规 ...

  8. 【安装】Linux下安装CUDA ToolKit 11.4和cuDNN 8

    注意!如果你使用的是pytorch,只需要装好CUDA,不需要装cuDNN.而且完全可以等到报错了再装CUDA,一般情况系统都已经装好CUDA Toolkit了. 除非你只装了低版本的CUDA Too ...

  9. 基于口令的密码—PBE

    目录 流程 加密流程 解密流程 盐的作用 通过拉伸来改良PBE的安全性 如何生成安全口令的建议 定义: PBE是一种根据口令生成密钥并用该密钥进行加密的方法. 加密和解密都使用同一个密钥. 口令一词多 ...

  10. k8s之statefulset控制器

    operator: statefulset:有状态副本集 特点 运行在: 1,稳定且唯一的网络标识符 2,稳定且持久的存储 3,有序,平滑地部署和扩展 4,有序,平滑地删除和终止 5,有序的滚动更新 ...