import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class demo {
public static void main(String[] args) {
ProductiveAndConsumption pac = new ProductiveAndConsumption();
new Thread(()->{
for(int i = 0 ;i<20;i++)
pac.printA();
},"A").start();
new Thread(()->{
for(int i = 0 ;i<20;i++)
pac.printB();
},"B").start();
new Thread(()->{
for(int i = 0 ;i<20;i++)
pac.printC();
},"C").start();
}
}
class ProductiveAndConsumption{
//
private Lock lock = new ReentrantLock(false);
//创建非公平锁; 默认就是非公平(性能比较高) true为公平锁
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();
private int number = 1;
public void printA(){
//开启锁
lock.lock();
try {
while (number!=1){
conditionA.await();
}
number=2;
conditionB.signal();
System.out.println(Thread.currentThread().getName()+"=>AAAA");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printB(){
//开启锁
lock.lock();
try {
while (number!=2){
conditionB.await();
}
number=3;
conditionC.signal();
System.out.println(Thread.currentThread().getName()+"=>BBBB");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printC(){
//开启锁
lock.lock();
try {
while (number!=3){
conditionC.await();
}
number=1;
conditionA.signal();
System.out.println(Thread.currentThread().getName()+"=>CCCC");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
JUC-Lock锁-生产者消费者模式顺序执行
最新推荐文章于 2024-08-16 23:08:28 发布
本文介绍了一个使用Java ReentrantLock和Condition实现的多线程生产者消费者问题的示例,展示了如何通过信号量机制协调线程间的同步和通信。三个线程分别负责生产A、B和C,通过条件变量确保数据流转的有序性。
摘要由CSDN通过智能技术生成