线程间定制化通信
【摘要】 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线程...
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轮。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)