利用Condition实现多线程交替执行
一、需求
- A、B、C 三个线程,循环10次,打印出自己的名称,ABC,ABC,ABC...
- A、B、C 三个线程,循环10次,打印出自己的名称,A一次,B三次,C五次,ABBBCCCCC,ABBBCCCCC
1.1、循环打印ABC
package com.example.demo.juc; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* @author DUCHONG
* @since 2019-01-21 10:46
**/
public class ABC { public static void main(String[] args) { PrintDemo pd=new PrintDemo();
//A 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printA(i);
}
}
},"A").start(); //B 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printB(i);
}
}
},"B").start(); //C 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printC(i);
}
}
},"C").start();
}
} class PrintDemo{ Lock lock =new ReentrantLock(); private Condition conditionA=lock.newCondition();
private Condition conditionB=lock.newCondition();
private Condition conditionC=lock.newCondition(); //哪个线程等待与否的标记,flag的值:
// 1 线程A打印,否则等待,同时将标记设置为2,唤醒线程B
// 2 线程B打印,否则等待,同时将标记设置为3,唤醒线程C
// 3 线程C打印,否则等待,同时将标记设置为1,唤醒线程A 外层一次循环结束。
private Integer flag=1;
//打印A
public void printA(int loop){
try{
lock.lock();
if(flag!=1){
conditionA.await();
} for (int i=1;i<=1;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
}
flag=2;
conditionB.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} }
//打印B
public void printB(int loop){
try{
lock.lock();
if(flag!=2){
conditionB.await();
} for (int i=1;i<=1;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
} flag=3;
conditionC.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} }
//打印C
public void printC(int loop){
try{
lock.lock();
if(flag!=3){
conditionC.await();
} for (int i=1;i<=1;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
}
flag=1;
conditionA.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} } }
结果:

1.2、循环打印ABBBCCCC
package com.example.demo.juc; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* @author DUCHONG
* @since 2019-01-21 14:15
**/
public class ABBB { public static void main(String[] args) {
PrintABBBDemo pd=new PrintABBBDemo();
//A 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printA(i);
}
}
},"A").start(); //B 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printB(i);
}
}
},"B").start(); //C 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printC(i);
}
}
},"C").start();
} } class PrintABBBDemo{ Lock lock =new ReentrantLock(); private Condition conditionA=lock.newCondition();
private Condition conditionB=lock.newCondition();
private Condition conditionC=lock.newCondition(); //哪个线程等待与否的标记,flag的值:
// 1 线程A打印,否则等待,同时将标记设置为2,唤醒线程B
// 2 线程B打印,否则等待,同时将标记设置为3,唤醒线程C
// 3 线程C打印,否则等待,同时将标记设置为1,唤醒线程A 外层一次循环结束。
private Integer flag=1;
//打印A
public void printA(int loop){
try{
lock.lock();
if(flag!=1){
conditionA.await();
} for (int i=1;i<=1;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
}
flag=2;
conditionB.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} }
//打印B
public void printB(int loop){
try{
lock.lock();
if(flag!=2){
conditionB.await();
} for (int i=1;i<=3;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
} flag=3;
conditionC.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} }
//打印C
public void printC(int loop){
try{
lock.lock();
if(flag!=3){
conditionC.await();
} for (int i=1;i<=5;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
}
flag=1;
conditionA.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} } }
结果:

利用Condition实现多线程交替执行的更多相关文章
- Java并发编程(二)如何保证线程同时/交替执行
第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...
- php利用wsh突破函数禁用执行命令(安全模式同理)
php利用wsh突破函数禁用执行命令(安全模式同理) 前提.需要服务器支持wsh.并知道php安装目录 但是php利用wsh执行命令是没有asp的权限高的. 突破代码 <?php $cmd= ...
- ASP.NET 多线程 监控任务执行情况,并显示进度条
关于多线程的基本概念和知识在本文中不多讲,而且我懂的也不是很透,说的太多误人子弟...对于我来说,做本文提到的功能够用就行,等实现其他效果不够用的时候,再深入研究 推荐看园子里的两篇博客应该就有个基本 ...
- 多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture
目录 1.Futrue 2.FutureTask 3.CompletionService 4.CompletableFuture 5.总结 ================正文分割线========= ...
- new Random().Next(1, 100); 多线程同时执行结果很高概率相同,
/// <summary> /// new Random().Next(1, 100); 多线程同时执行结果很高概率相同, /// 是用的当前时间为seed,时间相同结果相同 /// // ...
- PHP利用CURL_MULTI实现多线程
PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,因此可以使用PHP利用CURL_MULTI实现完成多线程类的任务,下面就 ...
- C# 不使用Task实现的多线程顺序执行
多线程有很好的并发性即无序性,在某些特殊情况下需要用到多线程然而又要使其具备顺序性,这种时候就有了一个特殊的场景那就是多线程顺序执行,在现在VS2015中Task自带了顺序执行的方法,但在此之前的旧项 ...
- Condition实现多线程顺序打印
Condition实现多线程顺序打印: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.R ...
- 利用osql/ocmd批处理批量执行sql文件
原文:利用osql/ocmd批处理批量执行sql文件 上周在测试环境建了几十张表,保存了.sql文件,准备在正式环境重建的时候懒得一个个打开建了,做一在网上搜寻了一下,果然有简单点的方法. 利用osq ...
随机推荐
- HDU - 5887:Herbs Gathering (map优化超大背包)
Collecting one's own plants for use as herbal medicines is perhaps one of the most self-empowering t ...
- JS监听键盘事件(回车键)
JS监听某个输入框 //回车事件绑定 $('#search_input').bind('keyup', function(event) { if (event.keyCode == "13& ...
- Cookie简单实例
Cookie简单实例 1.创建CookieServlet package com.servlet.study; import java.io.IOException; import java.io.P ...
- CF1117D Magic Gems
CF1117D Magic Gems 考虑 \(dp\) , \(f[i]\) 表示用 \(i\) 个单位空间的方案数,答案即为 \(f[n]\). 对于一个位置,我们可以放 \(Magic\) 的, ...
- BZOJ2763 JLOI2011 飞行路线 【最短路+DP】
BZOJ2763 JLOI2011 飞行路线 Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n ...
- 【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*
[2018.06.26NOIP模拟]T2号码bachelor 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质 ...
- 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)
在 .NET Framework 4.7 以前,WPF 程序的触摸处理是基于操作系统组件但又自成一套的,这其实也为其各种各样的触摸失效问题埋下了伏笔.再加上它出现得比较早,触摸失效问题也变得更加难以解 ...
- 重温CLR(九) 接口
对于多继承(multiple inheritance)的概念,许多程序员并不陌生,他是指一个类从两个或多个基类派生的能力.例如,假定TransmitData类的作用是发送数据,ReceiveData类 ...
- spring cloud feign 接口继承以及参数传递的问题
1. 优势 可以使用maven 进行访问,实现代码的共享,减少跨服务调用服务编写的问题 2. 使用 定义接口 publicinterfaceIUserService{ @Requ ...
- Linux环境下搭建Git仓库
1.安装Git $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum ...