Java 使用ReentrantLock锁实现生产者和消费者
package com.lpx.demo.demo.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Description:
* @author: lipeixin
* @create: 2024/1/12 13:45
*/
public class Main {
static int huowu = 0;
static Lock lock = new ReentrantLock();
static Condition condition;
public static void main(String[] args) {
condition = lock.newCondition();
Runnable car = () -> {
while (true) {
lock.lock();
if (huowu < 30) {
huowu++;
System.out.println(Thread.currentThread().getName() + "货物已装车:" + huowu);
try {
Thread.sleep(50);
condition.signalAll();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else {
System.out.println("卡车装满了等待卸货");
try {
condition.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
lock.unlock();
}
};
Runnable gr = () -> {
while (true) {
lock.lock();
if (huowu > 0) {
huowu--;
System.err.println("货物已卸车:" + huowu);
try {
Thread.sleep(50);
condition.signalAll();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else {
try {
System.out.println("货物卸完了等待填充");
condition.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
lock.unlock();
}
};
new Thread(car).start();
new Thread(car).start();
new Thread(gr).start();
}
}