今天我们使用condition简单实现一下生产者消费者模式。废话不多说直接上代码。
import java.util.PriorityQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
private ReentrantLock lock=new ReentrantLock();
private Condition NotEmpty=lock.newCondition();
private Condition NotFull=lock.newCondition();
private final int QueueSize=10;
private PriorityQueue queue=new PriorityQueue(QueueSize);
public static void main(String[] args) throws InterruptedException {
Main test=new Main();
Producer producer=test.new Producer();
Consumer consumer=test.new Consumer();
producer.start();
consumer.start();
Thread.sleep(10);
//使用interrupt给线程设置一个中断的标志位,但是不会立刻中断。
producer.interrupt();
consumer.interrupt();
}
//消费者消费元素
class Consumer extends Thread{
private boolean flag=true;
@Override
public void run(){
consumer();
}
public void consumer(){
while(flag)
{
lock.lock();
while(queue.size()==0)
{
System.out.println("队列中没有数据,消费者需要等待");
try {
//condition的await()方法类似于Object的wait方法
NotEmpty.await();
} catch (InterruptedException e) {
flag=false;
}
}
//从队列中拿出一个元素
queue.poll();
//condition的signal()方法类似于Object的notify()方法
NotFull.signal();
System.out.println("消费者从队列中拿出了一个元素,现在队列中还有"+queue.size()+"个元素");
lock.unlock();
}
}
}
//生产者生成元素
class Producer extends Thread{
@Override
public void run(){
producer();
}
private boolean flag=true;
public void producer(){
while(flag)
{
lock.lock();
while(queue.size()==QueueSize){
System.out.println("队列已经满了,无法在添加元素");
try {
NotFull.await();
} catch (InterruptedException e) {
flag=false;
}
}
//从队列中消费一个元素
queue.add(1);
NotEmpty.signal();
System.out.println("向队列中插入了一个元素,当前队列中有"+queue.size()+"个元素");
lock.unlock();
}
}
}
}