public class Main{
public static BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(5);
public static boolean flag=true;
class Producer implements Runnable {
@Override
public void run() {
while(flag){//到了时间之后生产者停止生产
try {
blockingQueue.put(1);
System.out.println(Thread.currentThread().getName()
+ "生产者生产,目前总共有" + blockingQueue.size());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("生产者停止生产");
}
}
class Consumer implements Runnable {
@Override
public void run() {
while(true){
try {
//blockingQueue.take();
Integer res=blockingQueue.poll(2, TimeUnit.SECONDS);
if(res==null){
System.out.println("超过两秒没有取道数据,消费者即将退出");
return ;
}
System.out.println(Thread.currentThread().getName()
+ "消费者消费,目前总共有" + blockingQueue.size());
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
Main test1=new Main();
new Thread(test1.new Producer()).start();
new Thread(test1.new Consumer()).start();
new Thread(test1.new Producer()).start();
new Thread(test1.new Consumer()).start();
new Thread(test1.new Producer()).start();
// new Thread(test1.new Consumer()).start();
Thread.sleep(3000);
flag=false;
}
}
最后的结果:
Thread-0生产者生产,目前总共有1
Thread-1消费者消费,目前总共有0
Thread-2生产者生产,目前总共有1
Thread-3消费者消费,目前总共有0
Thread-4生产者生产,目前总共有1
Thread-0生产者生产,目前总共有2
Thread-2生产者生产,目前总共有3
Thread-4生产者生产,目前总共有4
Thread-1消费者消费,目前总共有3
Thread-3消费者消费,目前总共有2
Thread-0生产者生产,目前总共有3
Thread-2生产者生产,目前总共有4
Thread-4生产者生产,目前总共有5
生产者停止生产
Thread-1消费者消费,目前总共有4
Thread-3消费者消费,目前总共有3
生产者停止生产
生产者停止生产
Thread-1消费者消费,目前总共有2
Thread-3消费者消费,目前总共有1
Thread-1消费者消费,目前总共有0
超过两秒没有取道数据,消费者即将退出
超过两秒没有取道数据,消费者即将退出
最后需要注意的是阻塞队列里面的几个关于添加元素和取出元素的方法的区别:
首先给个图(网上找的):
取出元素
1、poll方法:它可以输入两个参数:一个是时间的大小,一个是时间的单位,这个方法可以把队列头的元素取出来,如果没有,那么等待指定的时间,如果成功取出那么返回这个元素,如果超时了队列里面还是没有元素,那么返回null
2、take方法:没有输入参数,它的作用是取出队列头部元素,如果没有的话则一直阻塞等待。
添加元素
1、put:放入一个元素到队里里面,如果队列满了,那么一直阻塞
2、add:添加一个元素到队列,如果满了,那么抛出异常。插入成功返回ture,失败抛出异常
3、offer:对于一个空间有限的队列,经常用的还是offer,插入成功返回true,队列满了返回false。