实现
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 生产者消费者模式:利用Lock、Condition、await、signalAll
*
* @date 2021/12/9 9:27
*/
public class LockResource {
public static void main(String[] args) {
LockResource resource = new LockResource();
LockProducer producer = new LockProducer(resource);
LockConsumer consumer = new LockConsumer(resource);
new Thread(producer).start();
new Thread(consumer).start();
}
private int num = 0;
// 创建锁对象
Lock lock = new ReentrantLock();
// 创建条件对象
Condition condition = lock.newCondition();
public void produce() {
try {
// 开启锁
lock.lock();
// 防止虚假唤醒,采用while的方式进行判断
while (num >= 10) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num++;
System.out.println("生产者 - < " + Thread.currentThread().getName() + " >, 当前资源数量为:" + num);
// 生产完一个数据之后,就唤醒等待的消费者线程进行消费
condition.signalAll();
} finally {
// 释放锁
lock.unlock();
}
}
public void consume() {
try {
lock.lock();
while (num <= 0) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num--;
System.out.println("消费者 - < " + Thread.currentThread().getName() + " >, 当前资源数量为:" + num);
condition.signalAll();
} finally {
lock.unlock();
}
}
}
class LockProducer implements Runnable {
LockResource resource;
public LockProducer(LockResource resource) {
this.resource = resource;
}
@Override
public void run() {
while (true) {
resource.produce();
}
}
}
class LockConsumer implements Runnable {
LockResource resource;
public LockConsumer(LockResource resource) {
this.resource = resource;
}
@Override
public void run() {
while (true) {
resource.consume();
}
}
}
网友评论