Java-JUC(十):线程按序交替执行

问题:

有a、b、c三个线程,使得它们按照abc依次执行10次。

实现:

package com.dx.juc.test;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class ABC {public static void main(String[] args) {final AlternateDemo alternateDemo=new AlternateDemo();new Thread(new Runnable() {public void run() {for(int i=1;i<10;i++){alternateDemo.loopA(i);}}}, "A").start();new Thread(new Runnable() {public void run() {for(int i=1;i<10;i++){alternateDemo.loopB(i);}}}, "B").start();new Thread(new Runnable() {public void run() {for(int i=1;i<10;i++){alternateDemo.loopC(i);System.out.println("---------------------------------------");}}}, "C").start();}
}class AlternateDemo {private Lock lock = new ReentrantLock();private Condition conditionA = lock.newCondition();private Condition conditionB = lock.newCondition();private Condition conditionC = lock.newCondition();// 一个标号,标记当前可以执行的线程编号.1-a线程可以执行,2-b线程可以执行,3-c线程可以执行。private int flag = 1;public void loopA(int loopNum) {lock.lock();try {// 1)等待喚醒// 如果flag标记值不是1的话,就让线程处于等待状态,直到其他线程唤醒它。if (flag != 1) {conditionA.await();}// 2)被喚醒后,開始執行。for (int i = 1; i <= 1; i++) {System.out.println(Thread.currentThread().getName() + "-" + loopNum + "-" + i);}// 3)修改標記flag,并喚醒下一個線程。flag = 2;conditionB.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void loopB(int loopNum) {lock.lock();try {// 1)等待喚醒// 如果flag标记值不是2的话,就让线程处于等待状态,直到其他线程唤醒它。if (flag != 2) {conditionB.await();}// 2)被喚醒后,開始執行。for (int i = 1; i <= 1; i++) {System.out.println(Thread.currentThread().getName() + "-" + loopNum + "-" + i);}// 3)修改標記flag,并喚醒下一個線程。flag = 3;conditionC.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void loopC(int loopNum) {lock.lock();try {// 1)等待喚醒// 如果flag标记值不是3的话,就让线程处于等待状态,直到其他线程唤醒它。if (flag != 3) {conditionC.await();}// 2)被喚醒后,開始執行。for (int i = 1; i <= 1; i++) {System.out.println(Thread.currentThread().getName() + "-" + loopNum + "-" + i);}// 3)修改標記flag,并喚醒下一個線程。flag = 1;conditionA.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}
}

测试打印结果:

A-1-1
B-1-1
C-1-1
---------------------------------------
A-2-1
B-2-1
C-2-1
---------------------------------------
A-3-1
B-3-1
C-3-1
---------------------------------------
A-4-1
B-4-1
C-4-1
---------------------------------------
A-5-1
B-5-1
C-5-1
---------------------------------------
A-6-1
B-6-1
C-6-1
---------------------------------------
A-7-1
B-7-1
C-7-1
---------------------------------------
A-8-1
B-8-1
C-8-1
---------------------------------------
A-9-1
B-9-1
C-9-1
---------------------------------------

更多实现方案:

请参考《Java:现有线程T1/T2/T3,如何确保T1执行完成之后执行T2,T3在T2执行完成之后执行。》

转载于:https://www.cnblogs.com/yy3b2007com/p/8977265.html

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

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

相关文章

IntelliTrace 调试、定位异常

最近看了一个开源数据库管理&#xff0c;然后没有认真看它的配置环境&#xff0c;想看看是什么东西&#xff0c; 然后发现有类型转换的错误&#xff0c;但是一下子也定位不到哪里出错&#xff1f; 所以对于这种一下子找不到异常在哪里的&#xff0c;可以使用intellitrace智能跟…

java referencemap_Java中TypeReference用法说明

来源于&#xff1a;https://blog.csdn.net/zhuzj12345/article/details/102914545在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference&#xff0c;例如&#xff1a;void testTypeReference() {List list new ArrayList<>();list.add(1);list.add(9)…

zedboard--zynq使用自带外设IP让ARM PS访问FPGA(八) 转载

文章来源 http://blog.chinaaet.com/detail/34609 熟悉了xps的操作&#xff0c;IP添加&#xff0c;总线连接设置&#xff0c;图形化方法检查&#xff08;open graphical design view&#xff09;&#xff0c;检查总线及端口连接。 在file下面的图标中&#xff0c;打开导出到SDK…

[php入门] 4、HTML基础入门一篇概览

[php入门] 1、从安装开发环境环境到&#xff08;庄B&#xff09;做个炫酷的登陆应用 [php入门] 2、基础核心语法大纲 [php入门] 3、WAMP中的集成MySQL相关基础操作 1、HTML的作用   HTML是超文本标记语言&#xff0c;主要用于制作页面结构&#xff1b;而经常与之一起用的CSS是…

Python3 爬虫爬取中国图书网(淘书团) 记录

本人为一名刚开始学Python爬虫的小白&#xff0c;开贴仅为记录下自己的学习历程&#xff0c;方便做review 要爬取链接&#xff1a;http://tuan.bookschina.com/ 要爬取内容&#xff1a; 图书名称&#xff0c; 图书价格&#xff0c; 以及对应预览图的link 本文用到py packages: …

java连接字符串_Java如何连接字符串

Java中的连接是将两个字符串连接在一起的操作。您可以使用加()运算符或String的concat ()方法来连接字符串。使用运算符使用运算符是在Java中连接两个字符串的最常用方法。您可以提供变量&#xff0c;数字或字符串文字(始终用双引号括起来)。例如&#xff0c;要组合字符串“I’…

移动Web应用程序开发HTML5篇

https://software.intel.com/zh-cn/blogs/2012/03/09/webhtml5-offline-web-applications转载于:https://www.cnblogs.com/wln3344/p/4521909.html

分布式之延时任务方案解析

每天学习一点点 编程PDF电子书、视频教程免费下载&#xff1a;http://www.shitanlife.com/code引言 在开发中&#xff0c;往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付&#xff0c;则自动取消生成订单60秒后,给用户发短信对上述的任务&#xff0c;我们给一个专…

linux命令学习

Make 命令 http://www.cnblogs.com/peida/tag/%E6%AF%8F%E6%97%A5%E4%B8%80linux%E5%91%BD%E4%BB%A4/ 1 [developmentwww /]$ cd ————直接回到自己的主目录。 2 软件安装步骤 1、configure&#xff0c;这一步一般用来生成 Makefile&#xff0c;为下一步的编译做准备&#…

mysql 搭建日志服务器_一、架构01-搭建日志服务器Rsyslog

搭建日志服务器1、环境配置环境&#xff1a;node01 192.168.32.132 rsyslog服务器node02 192.168.32.128 rsyslog客户端2、node01、node02安装rsyslog软件包[rootnode01 ~]# yum install -y rsyslog[rootnode02 ~]# yum install -y rsyslog3、修改node01上rsyslog的配置文件…

使用了BeanUtils的简单操作

直接获取对象的某个值et.createCell(BeanUtils.getProperty(o, eh.getFieldName())); 简单为对象某个字段赋值c.setCellValue(BeanUtils.getProperty(datas.get(i),headers.get(j).getFieldName())); beanUtils的底层是内省。下面是又一个小例子&#xff0c;实现了map和bean的映…

NTP服务器

随着计算机网络的迅猛发展&#xff0c;网络应用已经非常普遍&#xff0c;众多的领域的网络系统&#xff0c;如电力&#xff0c;石化&#xff0c;金融业&#xff08;证券&#xff0c;银行&#xff09;&#xff0c;广电业&#xff08;广播&#xff0c;电视&#xff09;&#xff0…

ところが

ところが 1表示确定顺接条件&#xff0c;连接两个并存的事项&#xff0c;前项为后项的契机&#xff0c;相当于たら的部分用法  あしたは晴れるだろうと思って寝たが、翌朝起きてみたところ、やっぱり晴れていた。 2表示确定逆接条件&#xff0c;后项往往是与自己的意愿相反的…

mysql 永真_sql注入

Sql注入Sql注入成因&#xff1a;1)转义字符处理不当(如’,--,/**/,会截断原有的语句&#xff0c;执行新语句)&#xff1b;2)类型处理不当(如接受的是整型的参数&#xff0c;并没有校验也可以接受字符型数据)3)查询语句的组装不当4)错误处理不当5)权限配置不当(可以执行高权限语…

吐槽《黑客与画家》

书呆子与骚年 看到本书有关书呆子的描述时&#xff0c;反观自身&#xff0c;有很多感同身受的东西。从小我在大家眼里就是一个安静孤僻的书呆子&#xff0c; 外号“阴天使&#xff08;方言的谐音&#xff09;”。也由于安静的性格&#xff0c;使得我能坐得住安静地读书&#xf…

模板(Template)

最近阅读google chromium base container stack_container代码&#xff0c;深刻感觉到基础知识不扎实。 // Casts the buffer in its right type.T* stack_buffer() { return stack_buffer_.template data_as<T>(); }const T* stack_buffer() const { return stack_buff…

python异常值均值填充_Python 异常值分析

异常值分析是检验数据是否有录入错误以及含有不合常理的数据。忽视异常值的存在是十分危险的&#xff0c;不加剔除地把异常值包括进数据的计算分析过程中&#xff0c;对结果会产生不良影响&#xff1b;重视异常值的出现&#xff0c;分析其产生的原因&#xff0c;常常成为发现问…

近期学习清单

2019独角兽企业重金招聘Python工程师标准>>> 框架 1.编写xml性质的ioc容器demo&#xff08;附上博文一篇&#xff09; 2.编写unity形式的ioc容器demo&#xff08;附上博文一篇&#xff09; 3.编写自己的orm框架 c#语言特性 1.大量阅读有关枚举类&#xff0c;查询类…

java同名函数_浅谈Java 继承接口同名函数问题

在Java中如果一个类同时继承接口A与B&#xff0c;并且这两个接口中具有同名方法&#xff0c;会怎么样&#xff1f;动手做实验&#xff1a;interface A{void fun();}interface B{void fun();}interface C extends A,B{}public class Test implements C{Overridepublic void fun(…

判断两个树是否互相镜像

// 3. 判断两个树是否互相镜像 public static boolean isMirrorRec(TreeNode r1, TreeNode r2){ // 如果两个树都是空树&#xff0c;则返回true if(r1null && r2null){ return true; } // 如果有一棵树是空树&#xff0c;另一颗不是&#xff0c;则返回false if(…