首页 > 其他 > 详细

阻塞队列

时间:2020-05-27 20:40:10      阅读:36      评论:0      收藏:0      [点我收藏+]

 阻塞队列特性:FIFO  先进先出  first input first output

在多线程并发处理,线程池中我们会使用到阻塞队列。

不得不阻塞:

写入:如果队列满了,就必须阻塞等待

取出:当队列是空的,那就必须阻塞等待生产

BlockingQueye : 阻塞队列

Deque : 双端队列

AbstractQueue : 非阻塞队列

技术分享图片

 

 技术分享图片

 

查看队首元素:blockingQueue.element();

 

四组API:

技术分享图片

 

 

public class testBqq {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello world");
test5();
}
/*
抛出异常
*/
public static void test1(){
//队列大小
ArrayBlockingQueue bq = new ArrayBlockingQueue<>(3);
System.out.println(bq.add("a"));
System.out.println(bq.add("b"));
System.out.println(bq.add("c"));
//IllegalStateException: Queue full
//System.out.println(bq.add("d"));
System.out.println(bq.remove());
System.out.println(bq.remove());
System.out.println(bq.remove());
//NoSuchElementException
System.out.println(bq.remove());
}
/*
不抛出异常
*/
public static void test2(){
ArrayBlockingQueue bqueue = new ArrayBlockingQueue<>(3);
System.out.println(bqueue.offer("a"));
System.out.println(bqueue.offer("b"));
System.out.println(bqueue.offer("c"));
//溢出部分返回false
System.out.println(bqueue.offer("d"));
System.out.println(bqueue.poll());
System.out.println(bqueue.poll());
System.out.println(bqueue.poll());
//取空之后返回null
System.out.println(bqueue.poll());
}
public static void test3(){
ArrayBlockingQueue bqq = new ArrayBlockingQueue<>(3);
System.out.println(bqq.add("a"));
System.out.println(bqq.add("b"));
System.out.println(bqq.add("c"));
System.out.println(bqq.offer("d"));//没有位置 就返回false
//不抛出异常情况下的查看队首
System.out.println(bqq.peek());
System.out.println(bqq.remove());
//查看队首
System.out.println(bqq.element());
System.out.println(bqq.remove());
System.out.println(bqq.remove());
System.out.println(bqq.poll());//移除 不抛出异常 没有值返回null
}
/*
等待,阻塞 一直阻塞
*/
public static void test4() throws InterruptedException {
//队列的大小
ArrayBlockingQueue bqq = new ArrayBlockingQueue<>(3);
bqq.put("a");
bqq.put("b");
bqq.put("c");
//bqq.put("d");//队列没有位置了,一直阻塞

System.out.println(bqq.take());
System.out.println(bqq.take());
System.out.println(bqq.take());
//System.out.println(bqq.take());//队列没有位置了,一直阻塞等待
}
/*
超时,退出
*/
public static void test5() throws InterruptedException {
ArrayBlockingQueue bqq = new ArrayBlockingQueue<>(3);
bqq.offer("a");
bqq.offer("b");
bqq.offer("c");
bqq.offer("d",2, TimeUnit.SECONDS);//等待超时两秒就退出
System.out.println(bqq.poll());
System.out.println(bqq.poll());
System.out.println(bqq.poll());
System.out.println(bqq.poll(2, TimeUnit.SECONDS));//超过两秒就退出 放弃
}
}

 

 

 

 

同步队列:

没有容量,不用设置容量,最多存储一个元素。

存储一个元素,必须等待取出之后才能在放。  put  take

和其他的BlockingQueue不一样   SynchronousQueue不存储元素

put了一个元素,必须从里面先take取出来,否则不能out进去值

 

阻塞队列

原文:https://www.cnblogs.com/jzspace/p/12975802.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!