【JUC 阻塞队列中常用的四组方法】
2024-01-10 05:25:27
文章目录
BlockingQueue 中的 4 组不同的方法
抛异常 | 特定值 | 阻塞 | 超时 | |
---|---|---|---|---|
插入 | add(o) | offset(o) | put(o) | offset(o, time, unit) |
移除 | remove() | poll() | take() | poll(time, unit) |
检查 | element() | peek() |
提示:以下是本篇文章正文内容,下面案例可供参考
① add,remove,element
相当于一个普通的队列
富二代,脾气暴躁,稍微不合心意,就会抛出异常(你不说,我都不知道我这么🐂逼呢)。
代码如下(示例):
public class Test {
public static void main(String[] args) throws InterruptedException {
// 第一组,抛出异常组
// add 和 remove,element
// 指定容量为 3
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.add("a"));
System.out.println(blockingQueue.add("b"));
System.out.println(blockingQueue.add("c"));
// 添加第 4 个
// blockingQueue.add("d");
/** 抛出如下异常
*
* Exception in thread "main" java.lang.IllegalStateException: Queue full
*/
// 判断队列是否为 null,如果是则抛异常,不为空返回队首元素,但不删除
System.out.println(blockingQueue.element());
// 队列,先进先出
System.out.println(blockingQueue.remove());
System.out.println(blockingQueue.remove());
System.out.println(blockingQueue.remove());
// 无元素,仍要出队列
// System.out.println(blockingQueue.remove());
/**
* 抛出异常
* Exception in thread "main" java.util.NoSuchElementException
*/
}
}
② offer,poll,peek
还是一个普通的队列
普通人,脾气温和,讲道理,不合适就返回一个特殊值。(施主如果听不懂大乘佛法,贫僧也是略懂一些拳脚)
代码如下(示例):
public class Test {
public static void main(String[] args) throws InterruptedException {
// 第二组,返回特殊值
// offer,poll,peek
// 指定容量为 3
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.offer("a"));
System.out.println(blockingQueue.offer("b"));
System.out.println(blockingQueue.offer("c"));
// 如果队列不为 null,返回队列头元素,队列为空返回 null
// System.out.println(blockingQueue.peek());
// 插入第四个元素
// System.out.println(blockingQueue.offer("d"));
/**
* 进不去,返回
* false
*/
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
/** 没有第四个,返回
* null
*/
}
}
③ put,take
这时候才是阻塞队列
老实人,一直等待,直到她回心转意(燕子,没有你我怎么活啊~~~)
代码如下(示例):
public class Test {
public static void main(String[] args) throws InterruptedException {
// 第三组,阻塞(无返回值)
// put,take
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
blockingQueue.put("a");
blockingQueue.put("b");
blockingQueue.put("c");
// blockingQueue.put("d");
/**
* 一直卡住,直到有其他线程取出
*/
blockingQueue.take();
blockingQueue.take();
blockingQueue.take();
// blockingQueue.take();
/**
* 一直卡住,直到有其他线程放入新的元素
*/
}
}
④ offset(o, time, unit),poll(time, unit)
阻塞队列
土豪,就是任性(给你机会你也不中用啊)
public class Test {
public static void main(String[] args) throws InterruptedException {
// 第四组,有的等待时间
// 容量为 3
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
// 有空间相当于普通的 offset
System.out.println(blockingQueue.offer("a", 2L, TimeUnit.SECONDS));
System.out.println(blockingQueue.offer("b", 2L, TimeUnit.SECONDS));
System.out.println(blockingQueue.offer("c", 2L, TimeUnit.SECONDS));
// System.out.println(blockingQueue.offer("d", 2L, TimeUnit.SECONDS));
/** 两秒内不要,我就不给了
* 等待两秒后,直接返回 false
*/
// 有元素,相当于普通的 poll
System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
// System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
/** 两秒内不给,我就不要了
* 等待两秒。返回 null
*
*/
}
}
文章来源:https://blog.csdn.net/m0_69269392/article/details/135371051
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!