import java.util.Date;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* @创建人 xiaoshi
* @创建时间 2020/4/4
* @描述 生产者和消费者模式练习--Condition方式实现
*/
public class ProducterAndConsumer {
private ReentrantLock lock = new ReentrantLock();
private Condition notFull = lock.newCondition();
private Condition notEmpty = lock.newCondition();
private int queueSize = 10;
private Queue<String> queue = new LinkedBlockingQueue<>();
public void product(){
try{
lock.lock();
if(queue.size() >= queueSize){
notFull.await();
}
Thread.sleep(1000);
queue.offer(""+new Date().getTime());
notEmpty.signal();
System.out.println("生产者执行,存货:"+queue.size());
}catch (Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void consume(){
try{
lock.lock();
if(queue.isEmpty()){
notEmpty.await();
}
Thread.sleep(1000);
queue.poll();
notFull.signal();
System.out.println("消费者执行,存货:"+queue.size());
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args) {
ProducterAndConsumer demo = new ProducterAndConsumer();
Thread producter = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
demo.product();
}
}
});
Thread consumer = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
while(true) {
demo.consume();
}
}
});
producter.start();
consumer.start();
}
}