package com.atguigu.bigdata.juc;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @auth tianmin
* @date 2020-03-02 - 17:04
* @nodes 生产者消费者模型
* 1.实现生产者、消费者交替
*
* 总结:
* 1.高内聚,低耦合,线程操作资源类.
* 2.判断条件---->业务逻辑---->通知
* 3.防止虚假唤醒
* 4.Synchronized 配合 wait notifyAll
* 5.Lock 配合 await signalAll
*/
public class ProductConsume {
public static void main(String[] args) {
AirCondition air = new AirCondition();
// 启动2个线程,一个生产,一个消费
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
//TimeUnit.MILLISECONDS.sleep(100);
air.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"生产者1").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
//TimeUnit.MILLISECONDS.sleep(300);
air.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"生产者2").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
//TimeUnit.MILLISECONDS.sleep(200);
air.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"消费者1").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
//TimeUnit.MILLISECONDS.sleep(400);
air.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"消费者2").start();
}
}
class AirCondition{
private int number = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
//生产
public void increment() throws InterruptedException {
lock.lock();
try {
// 1 判断
// 1.1 线程间通信,不能用if 只能用while
while (number != 0){
//线程等待
condition.await();
}
// 2 业务逻辑
number++;
System.out.println("生产到了:" + number);
// 3 通知
condition.signalAll();
}finally {
lock.unlock();
}
}
//消费
public void decrement() throws InterruptedException {
lock.lock();
try {
// 1 判断
// 1.1 线程间通信,不能用if 只能用while
while (number == 0){
condition.await();
}
// 2 业务逻辑
number--;
System.out.println("消费剩下:" + number);
// 3 通知
condition.signalAll();
}finally {
lock.unlock();
}
}
}
生产者、消费者、新版写法
最新推荐文章于 2024-06-25 00:14:02 发布