【实践描述】
使用ReentrantLock,实现一个生产者消费者模式
【任务要求】
构建一个生产者,每隔1s生产出一块面包
构建两个消费者,消费者A每隔2s消费一块面包,消费者B3s消费一个面包
【思路点拨】
使用ReentrantLock.codition条件唤醒
每次执行任务时都需要拿到condition对象
生产完记得唤醒消费者
登录后即可发布作业,立即登录
我的作业
全部作业 3
public class ProducerConsumerExample {
private volatile List buffer = new ArrayList<>();
private final ReentrantLock lock = new ReentrantLock(true);
private final Condition work1 = lock.newCondition();
private final Condition work2 = lock.newCondition();
public void produce() {
try {
lock.lock();
System.out.println("生产者加锁");
buffer.add(new Random().nextInt(100));
System.out.println("生产池数量-->" + buffer.size());
System.out.println("通知两个消费者");
work1.signal();
work2.signal();
} finally {
lock.unlock();
System.out.println("生产者释放锁");
}
}
public void consume() {
try {
lock.lock();
System.out.println("消费者1加锁");
if (buffer.isEmpty()) {
System.out.println("生产池已经空了");
work1.await();
} else {
buffer.remove(0);
System.out.println("消费者1----生产池数量-->" + buffer.size());
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
System.out.println("消费者1释放锁");
}
}
public void consume2() {
try {
lock.lock();
System.out.println("消费者2加锁");
if (buffer.isEmpty()) {
System.out.println("生产池已经空了");
work2.await();
} else {
buffer.remove(0);
System.out.println("消费者2----生产池数量-->" + buffer.size());
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
System.out.println("消费者2释放锁");
}
}
public static void main(String[] args) {
ProducerConsumerExample example = new ProducerConsumerExample();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
example.consume();
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
example.consume2();
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
example.produce();
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
}
}