BlockingQueue<E>接口定义了包括两个附加功能的队列。这两个功能是:如果从空队列中取元素或者向满队列中增加元素,则进入等待状态。BlockinQueue接口中的方法pu(e)t和take()可以使其进入无限阻塞状态,可以用这两个方法实现生产者和消费者问题,比较简单。
代码如下:
package com.lk.B;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class Test5 {
private BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(2);
private class Producer implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<5;i++){
int b = new Random().nextInt(255);
try {
queue.put(b);
System.out.println("向队列中加入"+b+"\t队列中有"+queue.size()+"个元素");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private class Consumer implements Runnable{
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO Auto-generated method stub
for(int i=0;i<5;i++){
int b = 0;
try {
b=queue.take();
System.out.println("从队列中取出"+b+"\t队列中有"+queue.size()+"个元素");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Test5 test5 = new Test5();
Producer producer = test5.new Producer();
Consumer consumer = test5.new Consumer();
new Thread(producer).start();
new Thread(consumer).start();
}
}
运行结果:
/*
向队列中加入127 队列中有1个元素
向队列中加入113 队列中有2个元素
从队列中取出127 队列中有1个元素
向队列中加入88 队列中有2个元素
从队列中取出113 队列中有1个元素
从队列中取出88 队列中有0个元素
向队列中加入212 队列中有1个元素
从队列中取出212 队列中有0个元素
向队列中加入243 队列中有1个元素
从队列中取出243 队列中有0个元素
*/