并发编程java

news2024/11/22 19:16:34

1、CountDownLatch:

如果我们知道了我们的需要执行的任务数,那么我们可以用java并发包下的CountDownLatch,直接上代码:

public class CountDownLaunch {
	
	private static final Executor executor = Executors.newFixedThreadPool(2);
	
	
	public static void main(String[] args) {
		CountDownLaunch.concurrencyTest();
	}
	
	/**
	 * 要求并行执行完thread1、thread2才能执行
	 * thread3
	 */
	private static void  concurrencyTest() {
		
		// 创建一个count为2的CountDownLatch对象
		CountDownLatch countDownLatch = new CountDownLatch(2);
		
		// 并行执行以下2块代码,
		executor.execute(()->{
			System.out.println("thread1");
			// 每次任务执行完count -1
			countDownLatch.countDown();
		});
		
		executor.execute(()->{
			System.out.println("thread2");
			// 每次任务执行完count -1
			countDownLatch.countDown();
		});
		
		
		try {// 阻塞等待上面任务执行完,也就是count值为0/或线程被中断
			countDownLatch.await();
			System.out.println("thread3");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

2、CompletableFuture:

语意更加清晰,如 f3 = f1.thenCombine(f2, ()->{}) 能够清晰地表述“任务 3 要等待任务 1 和任务 2 都完成后才能开始,代码演示:

public class CompletableFutureTest {
	
	
	public static void main(String[] args) {
    	 CompletableFutureTest.testCompletableFuture();
     }
	
	private static void testCompletableFuture() {
		ThreadPoolExecutor threadPoolExecutor = ThreadPoolTest.getThreadPoolExecutor();
		
		// 从自定义线程池拿去线程异步处理数据
		CompletableFuture<String> CompletableFuture1 = CompletableFuture.supplyAsync(()->{
			System.out.println("thread1");
			return "thread1";
		}, threadPoolExecutor);
		
		// 从自定义线程池拿去线程异步处理数据
		CompletableFuture<String> CompletableFuture2 = CompletableFuture.supplyAsync(()->{
			System.out.println("thread2");
			return "thread2";
		}, threadPoolExecutor);
		System.out.println("thread3");
		try {
			// 这一步表示要CompletableFuture3的执行依赖于CompletableFuture1/CompletableFuture2执行成功
			CompletableFuture<String> CompletableFuture3 = CompletableFuture1.thenCombine(CompletableFuture2, (string1,string2)->{
				return string1+string2;
			});
			
			// 阻塞等待CompletableFuture3的结果
			String join = CompletableFuture3.join();
			System.out.println(join);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

创建CompletableFuture的4种方式:


//使用默认线程池
static CompletableFuture<Void> 
  runAsync(Runnable runnable)
static <U> CompletableFuture<U> 
  supplyAsync(Supplier<U> supplier)
//可以指定线程池  
static CompletableFuture<Void> 
  runAsync(Runnable runnable, Executor executor)
static <U> CompletableFuture<U> 
  supplyAsync(Supplier<U> supplier, Executor executor)  

默认情况下CompletableFuture使用的是公共的线程池forkJoinPool,那这个线程池默认创建的线程数是cpu的核数,在实际情况下,如果所有 CompletableFuture 共享一个线程池,那么一旦有任务执行一些很慢的 I/O 操作,就会导致线程池中所有线程都阻塞在 I/O 操作上,从而造成线程饥饿,进而影响整个系统的性能。所以,强烈建议你要根据不同的业务类型创建不同的线程池,以避免互相干扰。

创建完 CompletableFuture 对象之后,会自动地异步执行 runnable.run() 方法或者 supplier.get() 方法,对于一个异步操作,你需要关注两个问题:一个是异步操作什么时候结束,另一个是如何获取异步操作的执行结果。因为 CompletableFuture 类实现了 Future 接口,所以这两个问题你都可以通过 Future 接口来解决。

CompletableFuture .get()源码介绍:

 

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

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

相关文章

SpringBoot参数校验

简单数据类型 SpringBoot自带了validation工具可以从后端对前端传来的参数进行校验&#xff0c;用法如下&#xff1a; 引入validation起步依赖 <!-- 参数校验 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>sprin…

springboot、SpringCloud 常见版本版本介绍

官方版本号&#xff08;2023年5月6日&#xff09; Spring Boot 版本说明 Spring Boot的版本号分析&#xff1a; Spring Boot的版本以数字表示。例如&#xff1a;Spring Boot 2.4.1.RELEASE --> 主版本.次版本.增量版本&#xff08;Bug修复&#xff09; 主版本&#xff0c…

学系统集成项目管理工程师(中项)系列18a_进度管理(上)

1. 规划项目进度管理 1.1. 为实施项目进度管理制定政策、程序&#xff0c;并形成文档化的项目进度管理计划的过程 1.2. 输入 1.2.1. 项目管理计划 1.2.1.1. 范围基准 1.2.1.2. 其他信息 1.2.2. 项目章程 1.2.2.1. 【19下选43】 1.2.2.2. 项目章程中规定的项目审批要求和总…

python ---->>利用 urllib 库获取网络资源

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 &#xff08;1&#xff09;关于Python基本语法学习---->可以参考我的这篇博客《我在VScode学Python》 &#xff08;2&#xff09;pip是必须的在我们学习python这门语言的过程中Python ----&#xff1e;&a…

SAP: SMARTFORMS

事务码&#xff1a;SMARTFORMS 1、输入表格名&#xff0c;点击创建/更改/显示 2、设置页格式 查看页格式事务码&#xff1a;SPAD 创建的详细流程&#xff1a;详见博客ABAP开发Smartform实例_abap smartform_小强pp的博客-CSDN博客 SMARTFORMS TEMPLATE使用方法_Seele_1018的…

MT6771安卓手机核心板MT6771核心板方案智能模块

MT6771核心板是一款基于MTK平台、工业级高性能、可运行android10.0操作系统的4GAI安卓智能模块&#xff0c;核心处理器架构采用ARM4xCortex-A73upto2.0GHzARM4xCortex-A53upto2.0GHz&#xff0c;为智能设备提供了很好的运算支持。很高兴看到这个模块集成了4G LTE连接和高能效。…

界面开发框架Qt新手入门 - 自定义排序/筛选模型示例(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 自定义排序/筛选模型…

ALOHA 开源机械臂(Viper 300 Widow X 250 6DOF机械臂组成)第一部分

软件简介&#xff1a; ALOHA 即 A Low-cost Open-source Hardware System for Bimanual Teleoperation&#xff0c;是一个低成本的开源双手遥控操作硬件系统&#xff0c;即开源机械臂。其算法 Action Chunking with Transformers (ACT) 采用了神经网络模型 Transformers&#…

#杂谈 个人嵌入式开发的学习

本人目前从事的是嵌入式软件开发的相关工作。这是一个关于个人做项目时用过的开发工具的杂谈&#xff0c;仅是为了记录学习经历&#xff0c;同时也为和我有同样瞎搞东西的爱好者提供一个学习思路。 前言 我的技术栈&#xff1a; 下面介绍一下我用过在或者还在用的开发工具&…

JavaWeb综合案例-Servlet优化

将WebServlet的访问路径不要写死&#xff0c;写成通配符的形式 1. 反射笔记&#xff08;后续代码会用到该机制&#xff09; 1.1 基础概念 JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&am…

【Nodejs】Express实现接口

介绍 Express 是一个第三方模块&#xff0c;用于快速搭建服务器 类似于jquery与DOMExpress 是一个基于 Node.js 平台&#xff0c;快速、开放、极简的 web 开发框架。express保留了http模块的基本API&#xff0c;使用express的时候&#xff0c;也能使用http的APIexpress还额外封…

【花雕学AI】我们如何才能避免被ChatGPT替代?——一个跨学科的视角

ChatGPT是一个由OpenAI开发的AI文本工具&#xff0c;它可以理解和生成自然语言&#xff0c;从而与用户进行对话。ChatGPT是基于GPT-3或者GPT-4模型的&#xff0c;这是目前最大和最先进的语言模型之一。ChatGPT通过在大量的互联网文本数据上进行预训练和强化学习&#xff0c;学习…

linux修改程序的配置文件

修改指定文件中的数&#xff0c;例如创建一个文件如图 把6修改成7 修改完成 代码如下&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #incl…

【英语】大学英语CET考试,阅读部分1(阅读概述,SectionC仔细阅读140)

文章目录 1、阅读概述1.1 考试概况&#xff1a;大纲解读备考策略1.2 做题原则&#xff1a;定位1.3 标点符号和句子逻辑1.4 一级词汇 2、细节题&#xff08;10题占9题&#xff09;2.1 逻辑关系&#xff08;并列和递进&#xff0c;同一方向&#xff09;2.2 逻辑关系&#xff08;转…

Flutter学习之旅 -AspectRatio Card CircleAvatar组件

文章目录 AspectRatioCardCircleAvatar定义方法封装 AspectRatio AspectRatio的作用是根据设置调整子元素child的宽高比。 class MyHomePage extends StatelessWidget {const MyHomePage({Key? key}) : super(key: key);overrideWidget build(BuildContext context) {//获取设…

解决文件夹显示“文件夹变文件”的方法

在文件夹属性设置中&#xff0c;找到“文件名”&#xff0c;双击一下&#xff0c;选中的项目就会显示为“文件夹”&#xff0c;如果没有选中&#xff0c;点击“打开文件夹”就可以了。这是因为系统在默认情况下&#xff0c;所有的文件夹都是以系统默认的路径来命名的。当然也有…

构建 Kubernetes Operator 的原则是什么?

Kubernetes&#xff08;简称K8s&#xff09;上数据服务的自动化越来越受欢迎。在K8s上运行有状态的工作负载意味着使用Operator。然而&#xff0c;它发展演化到今天已经变得非常复杂&#xff0c;像Operator这样的应用模式和扩展方式对于开发者与运维者而言愈发受到欢迎。 但工…

【勝讯云 Finops Crane 集训营】基于 FinOps 的云资源分析与成本优化平台实操及说明

介绍 Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目&#xff0c;遵循 FinOps 标准&#xff0c;已经获得FinOps基金会授予的全球首个认证降本增效开源方案。它为使用 Kubernetes 集群的企业提供了一种简单、可靠且强大的自动化部署工具。 Crane 的设计初衷…

来这公司一年碰到的问题比我过去10年都多

无意间发现我们 Kafka 管理平台的服务的 open files 和 CPU 监控异常&#xff0c;如下图&#xff0c;有一台机器 CPU 和 opfen files 指标持续在高位&#xff0c;尤其是 open files 达到了4w。 原因分析 第一反应是这个服务请求很高&#xff1f;但是这个服务是一个管理服务不应…

云安全的挑战与发展:云原生安全将是未来趋势吗?

引言 随着企业数字化转型的推进和云计算的普及&#xff0c;云安全已经成为了当下IT行业的热点话题之一。尽管云计算已经被广泛应用&#xff0c;但在云安全方面仍存在一些挑战和问题。本文将探讨当前云安全面临的挑战&#xff0c;并分析云原生安全在未来的发展趋势。 第一章 云…