使用Condition加Lock解决生产者消费者问题
package com.mock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestProducerAndConsumer {
public static void main(String[] args) {
Product p = new Product();
new Thread(new Producer(p), "生产者1").start();
new Thread(new Consumer(p), "消费者1").start();
new Thread(new Producer(p), "生产者2").start();
new Thread(new Consumer(p), "消费者2").start();
}
}
class Producer implements Runnable {
private Product product;
public Producer(Product product) {
this.product = product;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
product.produce();
Thread.sleep(222);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private Product product;
public Consumer(Product product) {
this.product = product;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
product.consume();
}
}
}
/**
* 货物
*/
class Product {
private int total = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void produce() {
lock.lock();
try {
while (total >= 1) {
System.out.println("货物已满");
try {
condition.await();
} catch (InterruptedException e) {
}
}
System.out.println(Thread.currentThread().getName() + "##" + ++total);
condition.signalAll();
}finally {
lock.unlock();
}
}
public void consume() {
try {
lock.lock();
while (total <= 0) {
System.out.println("缺货中....");
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "##" + --total);
condition.signalAll();
}finally {
lock.unlock();
}
}
}