package com.mxgd.demo;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* @ClassName ReentranLockDemo
* @Description TODO
* @Author hspcadmin
* @Date 2023/12/2921:45
**/
public class ReentranLockDemo {
static Thread t1,t2,t3;
static volatile int state = 0;//保证打印abc的顺序 没有到你 你的获取到了锁 也得等待
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();//每个condition就是一个等待队列,可以把不同的任务放到不同的等待队列
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
t1 = new Thread(() -> {
lock.lock();
try {
//本身我有个疑问点 为啥线程里面能有for循环 for循环是线程的过程 当线程await之后 线程变成等待状态 等获取到锁之后 继续执行for循环的操作
//i=0 你有锁 你执行了一下 你唤醒了t2 signal就是包含了唤醒2和释放锁两个步骤 执行完你就没有锁了 你进入自己的等待队列
//等别的线程叫醒你之后你再接着执行
for (int i = 0; i < 5; i++) {
while (state % 3 != 0){
condition1.await();
}
System.out.printf("A");
condition2.signal();
//condition1.await();
state++;
}
condition2.signal();
}catch (Exception e){
}finally {
lock.unlock();
}
});
t1.start();
t2 = new Thread(() -> {
lock.lock();
try {
for (int i = 0; i < 5; i++) {
while (state % 3 != 1){
condition2.await();
}
System.out.printf("B");
condition3.signal();
//condition2.await();
state++;
}
condition3.signal();
}catch (Exception e){
}finally {
lock.unlock();
}
});
t2.start();
t3 = new Thread(() -> {
lock.lock();
try {
for (int i = 0; i < 5; i++) {
while (state % 3 != 2){
condition3.await();
}
System.out.printf("C");
state++;
condition1.signal();
//condition3.await();
}
condition1.signal();
}catch (Exception e){
}finally {
lock.unlock();
}
});
t3.start();
}
}
循环ABC的多线程协作
最新推荐文章于 2024-04-13 23:46:49 发布