启动三个线程,按照如下要求
AA打印5次,BB打印10次,CC打印15次
AA打印5次,BB打印10次,CC打印15次
进行10轮
做法 给予每个线程1个标志位flag=1,2,3
AA 判断flag=1,打印5次,修改标志位flag=2,通知BB
BB 判断flag=2,打印10次,修改标志位flag=3,通知CC
CC 判断flag=3,打印15次,修改标志位flag=1,通知AA
package com.atguigu.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
// 第一步 创建资源类
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();
}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();
}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();
}finally {
lock.unlock();
}
}
}
public class ThreadDemo3 {
public static void main(String[] args) {
ShareResource share=new ShareResource();
new Thread(()->{
for (int i = 0; i < 11; i++) {
try {
share.print5(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"AA").start();
new Thread(()->{
for (int i = 0; i < 11; i++) {
try {
share.print10(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"BB").start();
new Thread(()->{
for (int i = 0; i < 11; i++) {
try {
share.print15(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"CC").start();
}
}