如何保证线程A,B,C顺序执行,或者C在A、B后执行?

第一种方案:使用CountDownLatch工具类

CountDownLatch:是Java多线程编程中的一个同步工具类(计数锁),它允许一个或多个线程等待其他线程完成操作后再继续执行。其内部维护了一个计数器,当线程在执行任务完成后调用countDown()方法,该方法会将计数器的值减一,而等待线程通过调用await()方法来等待计数器的值变为0后才执行。

设计实现

//设计线程类public class ThreadA implements Runnable {//定时锁private CountDownLatch latch;//初始化public ThreadA(CountDownLatch latch){this.latch=latch;}@Overridepublic void run() {//1.执行System.out.println("A线程执行");//2.计数减1latch.countDown();}
}public class ThreadB implements Runnable {//两个定时锁(上一个线程和当前线程)private CountDownLatch latch1;private CountDownLatch latch2;//初始化public ThreadB(CountDownLatch latch1,CountDownLatch latch2){this.latch1=latch1;this.latch2=latch2;}@Overridepublic void run() {try {//1.等待上一个线程执行完成latch1.await();//2.执行System.out.println("B线程执行");//3.计数减1latch2.countDown();} catch (InterruptedException e) {e.printStackTrace();}}
}public class ThreadC implements Runnable {//定时锁private CountDownLatch latch;//初始化public ThreadC(CountDownLatch latch){this.latch=latch;}@Overridepublic void run() {try {//1.等待latch.await();//2.执行System.out.println("C线程执行");} catch (InterruptedException e) {e.printStackTrace();}}
}//测试线程A、B、C顺序执行
public class Main {public static void main(String[] args) {//创建线程A,B的定时锁,计数为1CountDownLatch latchA=new CountDownLatch(1);CountDownLatch latchB=new CountDownLatch(1);//创建线程A、B、CThread a = new Thread(new ThreadA(latchA));Thread b = new Thread(new ThreadB(latchA,latchB));Thread c = new Thread(new ThreadC(latchB));//a,b,c顺序执行a.start();b.start();c.start();}
}

第二种方案:使用Semaphore同步工具

Semaphore(信号量):是一种控制并发访问资源的同步工具,用来限制同时访问某个资源的线程数量。Semaphore内部维护一个计数器,该计数器用于表示可用的许可证数量。线程在访问资源之前必须先通过acquire()方法获得许可证,如果许可证数量为0,则线程必须等待,直到有其他线程释放许可证。当线程使用完资源后,使用release()方法释放许可证,以便其他线程可以继续访问资源。

(实现原理和上个方案思想相同)

第三种方案:使用wait()、notify()和notifyAll()方法

wait() 方法:使当前线程进入等待状态

notify() 方法:唤醒在相同对象上调用 wait() 方法进入等待状态的线程中的一个线程

notifyAll() 方法:唤醒在相同对象上调用 wait() 方法进入等待状态的所有线程只有一个线程会获得(抢到)对象锁,其余线程将继续等待锁的释放)。

class Main {static Object lock = new Object();//对象锁static int threadId = 1;//当前执行线程标志public static void main(String[] args) {//线程A、B、C的标志分别为1,2,3//创建三个线程Thread a = new Thread(new Runnable() {@Overridepublic void run() {try {//获取对象锁synchronized (lock) {//没有到当前线程执行,则释放锁进入等待状态while (threadId != 1) {lock.wait();}//轮到当前线程执行System.out.println("线程A执行");threadId = 2;lock.notifyAll();}} catch (InterruptedException e) {e.printStackTrace();}}});Thread b = new Thread(new Runnable() {@Overridepublic void run() {try {synchronized (lock) {while (threadId != 2) {lock.wait();}System.out.println("线程B执行");threadId = 3;lock.notifyAll();}} catch (InterruptedException e) {e.printStackTrace();}}});Thread c = new Thread(new Runnable() {@Overridepublic void run() {try {synchronized (lock) {while (threadId != 3) {lock.wait();}System.out.println("线程C执行");threadId = 1;lock.notifyAll();}} catch (InterruptedException e) {e.printStackTrace();}}});// 线程顺序执行a.start();b.start();c.start();}
}

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

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

相关文章

OpenAI 偷偷在训练 GPT-4.5!?

最近看到有人已经套路出 ChatGPT 当前的版本,回答居然是 gpt-4.5-turbo: 实际试验下,用 starflow.tech,切换到小星 4 全能版(同等官网最新 GPT-4),复制下面这段话问它: What is the…

olap/clickhouse-编译器优化与向量化

本文主要结合15721和clickhouse源码来聊聊向量化,正好我最近也在用Eigen做算子加速,了解下还是有好处的。 提示编译器 提示编译器而不是复杂化简单的代码 什么时候使用汇编,什么时候使用SIMD?下面有几个基本原则: …

【ES】--Elasticsearch的深度分页/内存超限等问题

目录 一、ES存在哪些问题二、以上问题的解决方案 一、ES存在哪些问题 对于ES搜索,往往会有一系列的问题。 (1)、默认ES翻页到10000条之后,会报错:ElasticsearchException[Elasticsearch exception [typeillegal_argument_exception, reasonR…

AttributeError: module ‘IPython.utils.traitlets‘ has no attribute ‘Unicode‘

format_type _traitlets.Unicode(_JAVASCRIPT_MODULE_MIME_TYPE) AttributeError: module ‘IPython.utils.traitlets’ has no attribute ‘Unicode’ 解决: …/python3.10/site-packages/google/colab/data_table.py 这里修改如下导包问题 # from IPython.utils…

零基础自学C语言|字符函数和字符串函数

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就学习一下这些函数。 📌字符分类函数 C语言中有一系列的函数是专门做字符分类的,也就…

mybatis框架的orm机制(类和数据库表的映射)

MyBatis框架之所以能够将数据库表映射到Java类,其核心原理是基于对象关系映射(ORM)。ORM是一种编程技术,用于在关系型数据库和面向对象编程语言之间建立映射关系,从而实现数据库表和对象之间的转换。 MyBatis实现映射…

对私域的认知,决定了你的私域能做多久!

现在,大部分企业对私域的认知是扭曲的。 比如,说到做私域,很多企业都是忙着往企业微信拉人,做自己的小程序商城来卖货。大多数企业就这样把私域当成了企业的独有“淘宝天猫”,这样做私域,可能会带来短期GM…

Flink系列之:Table API Connectors之Debezium

Flink系列之:Table API Connectors之Debezium 一、Debezium二、依赖三、使用Debezium Format四、可用元数据五、Format参数六、重复的变更事件七、消费 Debezium Postgres Connector 产生的数据八、数据类型映射 一、Debezium Debezium 是一个 CDC(Chan…

在 Windows 上安装并配置 dig命令 的步骤

介绍:dig 是一个网络工具,通常在 Unix 和类 Unix 系统上使用,用于查询 DNS(域名系统)信息。它可以用来获取域名相关的信息,比如 IP 地址、域名服务器的记录等。你可以使用 dig 命令来进行域名解析、查找特定…

Spring之手写IoC

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

DALL-E 系列:AI绘画背后的惊人真相!!【1个离奇内幕、3个意想不到、5大秘密揭示】

DALL-E 系列:AI绘图原理,根据用户给出的描述,生成与描述相匹配的图像 DALL-E 1dVAETransformer DALL-E 2CLIP先验 priordecoder(image) DALL-E 3 论文地址:https://arxiv.org/pdf/2102.12092.pdf DALL-E 的…

Android 原始方法实现Tablayout样式

源码: 【免费】Android原始方法实现Tablayout样式资源-CSDN文库 推荐: GitHub - hackware1993/MagicIndicator: A powerful, customizable and extensible ViewPager indicator framework. As the best alternative of ViewPagerIndicator, TabLayout …

PowerShell实战(一)PowerShell使用ImportExcel模块轻松操作Excel

目录 一、介绍 二、安装模块 三、操作示例 1、导出excel 2、读取Excel数据 3、导出包含图表的Excel 4、导出包含汇总列和图表的Excel 一、介绍 ImportExcel模块可以理解为基于PowerShell环境操作Excel的强大类库,使用它可以在 Windows、Linux 和 Mac 上都可以使用。…

119. 杨辉三角 II

描述 : 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和 题目 : LeetCode 119. 杨辉三角 II : 119. 杨辉三角 II 分析 : 这道题用二维数组来做 . 解析 : class Solution {pub…

企微私域裂变:数字化时代的企业增长新引擎

在当前的数字化时代,企业面临着客户获取和转化的挑战。为了解决这一问题,企微私域裂变作为一种新型的营销策略,逐渐受到企业的关注。通过精细化的运营、深入的用户洞察和创新的裂变手段,企微私域裂变帮助企业快速拓展市场&#xf…

GPT-4V with Emotion:A Zero-shot Benchmark forMultimodal Emotion Understanding

GPT-4V with Emotion:A Zero-shot Benchmark forMultimodal Emotion Understanding GPT-4V情感:多模态情感理解的zero-shot基准 1.摘要 最近,GPT-4视觉系统(GPT-4V)在各种多模态任务中表现出非凡的性能。然而,它在情感识别方面的功效仍然是个问题。本文定…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring的AOP前奏

第一章 AOP前奏 1.1 代理模式 代理模式:我们需要做一件事情,又不期望自己亲力亲为,此时,可以找一个代理【中介】 我们【目标对象】与中介【代理对象】不能相互转换,因为是“兄弟”关系 1.2 为什么需要代理【程序中…

JavaScript中audio停止播放事件

在HTML中&#xff0c;使用JavaScript来控制<audio>元素的播放和停止。要停止播放音频&#xff0c;使用pause()方法。 以下是一个示例&#xff0c;展示了如何使用JavaScript来停止播放音频&#xff1a; <!DOCTYPE html> <html> <body><audio id&qu…

css+html横向滚动+固定宽

没什么好说的&#xff0c;快上代码&#xff01; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Do…