现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序
目录
1、利用CountDownLatch
2、利用Future
最近在面试的时候,经常遇到这个题目,首先从题目上看,就知道考察的是多线程方面知识,我第一次看到这个题目的时候,就想到了使用CountDownLatch这个计数器来实现,因为它的原理就是让一个线程或多个线程去等待另外线程执行完毕后再执行的,本篇文章,我打算用两种方式去实现这个题目,分别是使用CountDownLatch和Future来实现。
1、利用CountDownLatch
如果第一次听说CountDownLatch的话,也没用关系,我会用最通俗易懂的话去介绍。
CountDownLatch其实就是一个计数器,在new这个对象的时候,需要在CountDownLatch的参数中传递一个int类型的数字,并且这个int类型必须大于等于0。
而这个count值传递给Sync后,就会调用一个setState方法,这是AQS里面的内容,过多的我就不去讲述,如果有兴趣的话可以去网上搜一下AQS了解一下。这个state有三种,分别是0、1、大于1,首先0就代表着目前还没有线程去占用这个资源,可以抢占,1代表着目前已经有一个线程抢占着这个资源了,不允许其他线程再进来了,这时其他线程就会被放入到一个双向链表队列进行阻塞等待(可以去了解一下AQS的阻塞队列),大于1呢就是说这个资源被重入的次数。所以,利用该状态码值就可以实现阻塞线程。
接着介绍一下CountDownLatch的常用方法
方法名 | 解释 |
await() | 让线程去阻塞等待 |
countDown() | 使计数器的值-1,直到减为0后,代表所有线程执行完毕 |
getCount() | 获取当前计数器值 |
boolean await(long timeout, TimeUnit unit) | 此方法至多会等待指定的时间,超时后会自动唤醒,若 timeout 小于等于零,则不会等待。 若计数器变为零了,则返回 true;若指定的等待时间过去了,则返回 false |
CountDownLatch(int count) | count为计数器的初始值 |
示例代码
public class CountDownLatchTest {public static void main(String[] args) throws InterruptedException {CountDownLatch c = new CountDownLatch(2);//初始化一个对象,把计数器定为2new Thread(() -> {System.out.println("我是线程1");c.countDown();//计数器减一}, "t1").start();new Thread(() -> {System.out.println("我是线程2");c.countDown();//计数器减一}, "t2").start();c.await();//调用await方法,让线程3等待前两个线程执行完毕new Thread(() -> {System.out.println("我是线程3");}, "t3").start();}
}
2、利用Future
Future其实就是一个异步任务监视器,可以监视任务的执行,也可以取消任务的执行,同时也可以通过get()方法获取执行后的返回结果。
为了方便演示效果,我使用了有返回结果的Callable来实现。
Future的常用方法
方法 | 解释 |
get() | 此方法就是获取线程池提交任务返回的结果,这个方法会一直阻塞其他线程,任务执行完毕后才会获取值。也可以传递超时时间,如果任务超过的超时时间,就会报错。 |
boolean isDone() | 判断任务是否运行完毕,如果运行完毕就返回true,否则返回false |
boolean isCancelled() | 判断任务是否已被取消,如果是返回true,否则false |
boolean cancel(boolean mayInterruptIfRunning) | 试图取消任务的执行。如果传入的参数是 true,执行任务的线程就会收到一个中断的信号,正在执行的任务可能会有一些处理中断的逻辑,进而停止。 如果传入的是 false 则就代表不中断正在运行的任务,也就是说,本次 cancel 不会有任何效果,同时 cancel 方法会返回 false。 |
public class FutureTest {public static void main(String[] args) throws ExecutionException, InterruptedException {//首先创建一个线程池ExecutorService executorService = Executors.newCachedThreadPool();//线程池的submit返回值类型就是FutureFuture<String> s1 = executorService.submit(new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(200);//模拟程序运行时间return "我是线程1";}});Future<String> s2 = executorService.submit(new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(200);//模拟程序运行时间return "我是线程2";}});try {System.out.println(s1.get(1000, TimeUnit.MILLISECONDS));} catch (TimeoutException e) {e.printStackTrace();}try {System.out.println(s2.get(1000, TimeUnit.MILLISECONDS));} catch (TimeoutException e) {e.printStackTrace();}if (s1.isDone() && s2.isDone()) {Thread.sleep(300);//模拟程序运行时间System.out.println("我是线程3");}executorService.shutdown();}
}
相关文章:

现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序
目录 1、利用CountDownLatch 2、利用Future 最近在面试的时候,经常遇到这个题目,首先从题目上看,就知道考察的是多线程方面知识,我第一次看到这个题目的时候,就想到了使用CountDownLatch这个计数器来实现,…...

83.qt qml-初步学习2D粒子影响器(二)
由于QmlBook in chinese翻译过来的文字有些比较生疏难于理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 QML粒子所有类型: Qt Quick Particles QML Types | Qt Quick 6.5.0 Affector类型: Attractor QML Type | Qt Quick 6.5.…...

4.17-4.18学习总结
MD5 MD5: 1、压缩性 2、容易计算 3、抗修改性 4、弱抗碰撞 5、强抗碰撞 为什么需要MD5? 存储一些敏感信息的时候,如果不进行加密会出现安全问题。 例如:系统登录的密码,如果数据库中的密码采用明文,一旦数据库泄…...

Spring事务
事务作用: 事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或 业务层 保障一系列的数据库操作同成功同失败 Spring为了管理事务,提供了一个平台事务管理器PlatformTransactionManager commit是用来提…...

Linux新的设备或分区挂载到系统中mount使用方法
如果想将一个新的设备或分区挂载到系统中,可以按照以下步骤进行操作: 确定要挂载的设备或分区的设备名,例如 /dev/sdb1。 创建挂载点,可以在任何目录下创建一个新目录作为挂载点,例如 /mnt/mydevice。 sudo mkdir /mn…...

移动硬盘损坏如何恢复数据
移动硬盘一种小巧便携的存储介质,可用于各电脑之间交换大容量数据,可以随时插拔,进行高速传输数据。但有好也有坏,在我们使用中也会出现一些移动硬盘损坏故障,比如说提示格式化、硬盘分区丢失、误格式化、文件误删除等…...

Material Design:为你的 Android 应用提供精美的 UI 体验
Material Design:为你的 Android 应用提供精美的 UI 体验 介绍 Material Design 概念:介绍 Material Design 是 Google 推出的一种设计语言,用于创建现代、美观、直观且一致的用户界面。解释 Material Design 的基本原则,包括材料…...

springboot+vue学生毕业离校系统(源码+说明文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的学生毕业离校系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...

【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?
目录 一、ContentResolver基本用法 如何查询? 如何向表中添加一条数据? 如何更新这条新添加的数据? 如何删除这条数据? 二、读取系统联系人 要想你的APP访问其他应用程序的数据,需要使用内容提供器,下面使…...

【100个 Unity实用技能】 | InputField输入框组件实现输入限制,只能输入中文或特殊字符等
🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…...

倍数+路径之谜
倍数 :用户登录https://www.lanqiao.cn/problems/583/learning/?page5&first_category_id1&sortstudents_count 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 请问在 1 到 2020 中,有多少个…...

【Unity渲染】URP透明物体自身渲染穿插异常问题
背景: 对于URP中的某个物体,我们如果希望他正反面都可以被渲染。 通常会有两种解决方案: 1.将网格设置为双面网格。(此种情况Mesh.RecalculateNormals计算结果可能会异常,解决可参考网格法线生成异常解决࿰…...

c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL
c/c:指针,指针定义和使用,指针大小4字节,野指针,空指针*pNULL 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学…...

CAS实现原⼦操作的三⼤问题,该如何解决?
目录 1、ABA问题 2.循环时间长开销大 3、只能保证一个共享变量的原子操作 总结: CAS(Compare-and-Swap)是一种用于实现原子操作的技术,但是它存在着三个主要的问题:ABA问题、循环时间长开销大、只能保证一个共享变…...

Linux Shell 实现一键部署二进制go+caddy+filebrowser
filebrowser filebrowser 是一个使用go语言编写的软件,功能是可以通过浏览器对服务器上的文件进行管理。可以是修改文件,或者是添加删除文件,甚至可以分享文件,是一个很棒的文件管理器,你甚至可以当成一个网盘来使用。…...

无人机巡检智能一体化解决方案
随着无人机技术的不断发展,无人机应用领域已经越来越生活化,其产品不仅在军事、商业等领域得到了广泛应用,也在普通人的生活中得到了广泛应用。无人机的自动巡检是无人机应用的一个重要方向,具有广阔的发展前景,本文将…...

2023-2029全球粘结剂喷射技术行业调研及趋势分析报告
2022年全球粘结剂喷射技术市场规模约5.8亿元,2018-2022年年复合增长率CAGR约为 %,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近12亿元,未来六年CAGR为11.3%。 本文调研和分析全球粘结剂喷射技术发展现状及未来趋势&a…...

Python每日一练(20230420)
目录 1. 数组逐位判断 🌟 2. 交错字符串 🌟🌟 3. 二进制求和 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 数组逐位判断 比如…...

【社区图书馆】读《悲惨世界》有感
文章目录 故事简介经典重现价值取向我的思想 故事简介 《悲惨世界》是一部充满了悲剧的小说,故事首先由教堂展开,然后主要围绕着主人公冉阿让进行一系列的生动形象的描写,讲述了冉阿让悲惨的一生。 主人公冉阿让是一个诚实、善良的工人&…...

随机蛙跳算法 (SFLA)简单实现(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 随着计算机科学与技术的迅速发展,人类生存空间的扩大以及认识与改造世界范围的拓宽,人们对科学技术提出了新的和更高的要求,其…...

【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令
【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令 目录 【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令 一、上讲回顾 二、ROS2核心命令讲解 1、daemon-各种守护进程相关的子命令 2、node-各种节点进程相关的子命令 3、pkg-各种包进程相关的子命令 4、run运行特定软…...

如何训练个人的ChatGpt4
如何在自己的计算机上安装类似 ChatGPT 的个人 AI 并在没有互联网的情况下运行它 个人 AI 的“第一台 PC”时刻 这是个人AI的“第一台PC”时刻,随之而来的是限制,就像在车库里生产第一台Apple 1一样。你是先驱。今天,任何人都可以使用私人和…...

Rabbit与springboot整合-1
目录 1、整体结构 2、pom引入 3、配置文件 4、代码 公共类 controller类 JSON转换类 监听-接收发送消息类 1、整体结构 2、pom引入 <!--rabbitmq--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st…...

项目沟通管理5大技巧 第4个很重要
1、充分使用twitter管理沟通模型 项目沟通会议可以充分使用witter的管理沟通模型,提高会议沟通效率。使用此模型,主要是有三步: 第一步:倾听,项目经理需要保持中立的立场,不先表态,让团队成员畅…...

vector(入门知识点)
目录 vector的介绍 编辑 例:遍历 拷贝: 初始化: 反向迭代器: 扩容: insert与erase vector的介绍 例:遍历 拷贝: 初始化: (10个1) vector<int>注意…...

成人高考专业怎么选?看这三点
专业选得好,以后学习、考试和就业都会走得更加顺畅。 想简单拿个大专或者本科学历文凭,最好选择容易毕业的,比如工商管理、行政管理文史类专业,相对简单容易。 为了满足考证需要的,选对口的专业,比如要考一…...

设计模式:UML中的类图(6种关系)
一.UML图介绍 统一建模语言是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。 UML 从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等 9 种图。 二.类图…...

00后卷王的自述,我真有同事口中说的那么卷?
前言 前段时间去面试了一个公司,成功拿到了offer,薪资也从14k涨到了20k,对于工作都还没几年的我来说,还是比较满意的,毕竟一些工作5、6年的可能还没我高。 我可能就是大家口中的卷王,感觉自己年轻…...

VS2022配置OpenGL+GLAD
Glew(The OpenGL Extension Wrangler Library)是对底层OpenGL接口的封装,可以让你的代码跨平台。Glad与Glew作用相同,可以看作它的升级版。 Freeglut(OpenGL Utility Toolkit)主要用于创建并管理窗口和Ope…...

javascript for循环的定义
循环代码可以执行指定的次数 不同类型的循环: javascript支持不同类型的循环 for-循环代码块的一定次数 for/in-循环遍历对象的属性 while-当指定的条件为true时循环指定的代码块 do/while-当指定的条件为true时循环指定的代码块 for循环的语法: …...