阻塞队列BlockingQueue

使用场景

多线程并发处理,线程池

使用方法

添加,移除

四组API(应用程序接口)

1. add和remove(会抛出异常),检测队列首个元素(element)

/*
* 会抛出异常
*
* */
public static void test1(){
//capacity:队列容量
ArrayBlockingQueue<Object> blockingqueue = new ArrayBlockingQueue<>(3);
//添加队列
System.out.println(blockingqueue.add("a"));
System.out.println(blockingqueue.add("b"));
System.out.println(blockingqueue.add("c"));
//Queue full 队列已满
//System.out.println(blockingqueue.add("d"));
System.out.println("第一个元素为"+blockingqueue.element());
//取出队列
System.out.println(blockingqueue.remove());
System.out.println(blockingqueue.remove());
System.out.println(blockingqueue.remove());
//NoSuchElementException 没有元素
//System.out.println(blockingqueue.remove());
}

2. offer,poll(不会抛出异常),检测队列首个元素(peek)

/*
* 不会抛出异常
*
* */
public static void test2(){
//capacity:队列容量
ArrayBlockingQueue<Object> blockingqueue = new ArrayBlockingQueue<>(3);
//插入元素
System.out.println(blockingqueue.offer("a"));
System.out.println(blockingqueue.offer("b"));
System.out.println(blockingqueue.offer("c"));
//如果没有插入成功就返回false,插入成功就返回true
System.out.println(blockingqueue.offer("d"));
System.out.println("第一个元素为"+blockingqueue.peek());
//取出元素
System.out.println(blockingqueue.poll());
System.out.println(blockingqueue.poll());
System.out.println(blockingqueue.poll());
//有元素就取出相应的元素(先进先出FIFO),如果没有就返回null
System.out.println(blockingqueue.poll());
}

3.阻塞等待(一直等,等到天荒地老)put,take

/*
* 阻塞等待
*
* */
public static void test3() throws InterruptedException {
//capacity:队列容量
ArrayBlockingQueue<Object> blockingqueue = new ArrayBlockingQueue<>(3);
blockingqueue.put("a");
blockingqueue.put("a");
blockingqueue.put("a");
//程序卡在这里了,程序不会运行了(要避免发生这样的情况)
//blockingqueue.put("a");
System.out.println(blockingqueue.take());
System.out.println(blockingqueue.take());
System.out.println(blockingqueue.take());
//没有第四个元素,所以一直会等,等到第四个元素出现(但的四个元素不可能会出现)
System.out.println(blockingqueue.take());
}

4.延时等待(在限定的等待时间之内,如果没有等到对应的操作,就按照顺序执行代码)

public static void test4() throws InterruptedException {
//capacity:队列容量
ArrayBlockingQueue<Object> blockingqueue = new ArrayBlockingQueue<>(3);
blockingqueue.offer("a");
blockingqueue.offer("b");
blockingqueue.offer("c");
System.out.println("超额添加");
//等待两秒,如果队列还是阻塞的状态,就放弃添加,执行下面的代码
blockingqueue.offer("d",2, TimeUnit.SECONDS);
System.out.println("放弃添加");
System.out.println(blockingqueue.poll());
System.out.println(blockingqueue.poll());
System.out.println(blockingqueue.poll());
System.out.println("等待新元素添加");
//等待两秒,如果队列还没有添加新元素,就放弃获取元素
blockingqueue.poll(2,TimeUnit.SECONDS);
System.out.println("没有新元素的添加");
System.out.println("白");
}
posted @   小罗要有出息  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示