2025-01-20 21:28:35 +08:00
|
|
|
|
# Java并发容器使用
|
|
|
|
|
|
|
|
|
|
## ArrayBlockingQueue使用
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(8);
|
|
|
|
|
|
|
|
|
|
// 阻塞添加
|
|
|
|
|
queue.add("1");
|
|
|
|
|
queue.add("2");
|
|
|
|
|
queue.add("3");
|
|
|
|
|
System.out.println(queue);
|
|
|
|
|
|
|
|
|
|
// 非阻塞添加
|
|
|
|
|
queue.put("4");
|
|
|
|
|
queue.put("5");
|
|
|
|
|
System.out.println(queue);
|
|
|
|
|
|
|
|
|
|
// 阻塞添加,但队列满不会进入阻塞
|
|
|
|
|
queue.offer("6");
|
|
|
|
|
queue.offer("7");
|
|
|
|
|
System.out.println(queue);
|
|
|
|
|
|
|
|
|
|
// 指定时间内进入阻塞
|
|
|
|
|
queue.offer("8", 3, TimeUnit.SECONDS);
|
|
|
|
|
queue.offer("9", 3, TimeUnit.SECONDS);// 8个队列满,不会进入阻塞
|
|
|
|
|
System.out.println(queue);
|
|
|
|
|
|
|
|
|
|
// 从头部获取数据并移出,如果队列为空进入阻塞直到有数据添加
|
|
|
|
|
String take = queue.take();
|
|
|
|
|
System.out.println(take);
|
|
|
|
|
|
|
|
|
|
// 获取数据并移出队列第一个元素,如果队列为空将会阻塞指定的时间,直到在此期间有新数据写入,或者当前线程被其他线程中断,当线程超时会返回null
|
|
|
|
|
String poll = queue.poll(3, TimeUnit.SECONDS);
|
|
|
|
|
System.out.println(poll);
|
|
|
|
|
|
|
|
|
|
// 从头部获取数据并移出,如果队列为空不会阻塞
|
|
|
|
|
String poll1 = queue.poll();
|
|
|
|
|
System.out.println(poll1);
|
|
|
|
|
|
|
|
|
|
// 从头部获取数据不会移除,队列为空不会阻塞直接返回null
|
|
|
|
|
String peek = queue.peek();
|
|
|
|
|
System.out.println(peek);
|
2025-01-20 21:33:37 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## PriorityBlockingQueue使用
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
// 无边界队列,可以定义初始容量并不是最大容量
|
|
|
|
|
PriorityBlockingQueue<Integer> queue = new PriorityBlockingQueue<>(2);
|
|
|
|
|
System.out.println(queue);
|
|
|
|
|
|
|
|
|
|
// 队列的添加方法都等于offer方法
|
|
|
|
|
queue.offer(1);
|
|
|
|
|
queue.offer(10);
|
|
|
|
|
queue.offer(3);
|
|
|
|
|
System.out.println(queue);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## LinkedBlockingQueue使用
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
// 属于可选边界
|
|
|
|
|
LinkedBlockingQueue<Integer> integers = new LinkedBlockingQueue<>(10);
|
|
|
|
|
boolean b = integers.remainingCapacity() == 10;
|
|
|
|
|
System.out.println(b);
|
|
|
|
|
|
|
|
|
|
// 等于定义的
|
|
|
|
|
LinkedBlockingQueue<Integer> integers1 = new LinkedBlockingQueue<>();
|
|
|
|
|
boolean b1 = integers1.remainingCapacity() == Integer.MAX_VALUE;
|
|
|
|
|
System.out.println(b1);
|
2025-01-20 21:28:35 +08:00
|
|
|
|
```
|