线程间定制化通信--交替打印
1、案例介绍
启动三个线程AA、BB、CC,线程AA打印5次,线程BB打印30次,线程CC打印15次,按照顺序循环10轮
2、实现流程
设置三个标志位,
flag=1的时候,AA线程打印5次,同时修改标志位flag=2,通知BB线程
flag=2的时候,BB线程打印10次,同时修改标志位flag=3,通知CC线程
flag=3的时候,CC线程打印15次,同时修改标志位flag=1,通知AA线程
3、代码实现
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//1、创建资源类,定义属性和操作方法
class ShareResource{
//定义标志位
private int flag=1;//1 AA 2 BB 3 CC
//创建Lock锁
private Lock lock=new ReentrantLock();
//创建三个condition
private Condition c1=lock.newCondition();
private Condition c2=lock.newCondition();
private Condition c3=lock.newCondition();
//打印5次,参数第几轮
public void print5(int loop) throws InterruptedException {
//上锁
lock.lock();
try {
//判断
while(flag!=1){
//等待
c1.await();
}
//干活
for (int i = 1; i <=5 ; i++) {
System.out.println(Thread.currentThread().getName()+"::"+i+" :轮数"+loop);
}
//通知
flag=2; //修改标志位
c2.signal(); //通知BB线程
}finally {
//解锁
lock.unlock();
}
}
//打印10次,参数第几轮
public void print10(int loop) throws InterruptedException {
lock.lock();
try {
while(flag!=2){
c2.await();
}
//干活
for (int i = 1; i <=10 ; i++) {
System.out.println(Thread.currentThread().getName()+"::"+i+" :轮数"+loop);
}
//通知
flag=3; //修改标志位
c3.signal(); //通知CC线程
}finally {
lock.unlock();
}
}
//打印15次,参数第几轮
public void print15(int loop) throws InterruptedException {
lock.lock();
try {
while(flag!=3){
c3.await();
}
//干活
for (int i = 1; i <=15 ; i++) {
System.out.println(Thread.currentThread().getName()+"::"+i+" :轮数"+loop);
}
//通知
flag=1; //修改标志位
c1.signal(); //通知CC线程
}finally {
lock.unlock();
}
}
}
public class ThreadDemo3 {
public static void main(String[] args) {
ShareResource shareResource=new ShareResource();
new Thread(()->{
for (int i = 1; i <=10 ; i++) {
try {
shareResource.print5(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"AA").start();
new Thread(()->{
for (int i = 1; i <=10 ; i++) {
try {
shareResource.print10(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"BB").start();
new Thread(()->{
for (int i = 1; i <=10 ; i++) {
try {
shareResource.print15(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"CC").start();
}
}
从结果可以看到,三个线程一直在循环打印,总共打印了10轮。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-10-24 GridControl GridView 修改表格中的标题居中
2020-10-24 DevExpress数据绑定呈现