对于阻塞队列的理解:
一个队列会进行写、取操作,我们都知道队列的先进先出的(FIFO),对于写入来讲 阻塞情况的发生是:当队列满了,无法进行写操作时就会发生阻塞。对于取来说,队列中没有数据就会发生阻塞等待,等待着生产。 这两种情况是不得不阻塞。
对于BlockingQueue我们可以去了解它的继承关系。
队列的使用:添加和移除,
BlockingQueue有四组API,分别是在超出容量和取不到元素时是抛出异常还是给出返回值亦或进行阻塞等待还是进行超时等待。要进行不同的结果需要使用不同的方法。
方式 | 添加 | 移除 | 检测队首元素 |
---|---|---|---|
抛出异常 | add() | remove() | element() |
有返回值,不会抛出异常 | offer() | poll() | peek() |
阻塞等待 | put() | take() | – |
超时等待 | offer() | poll() | – |
SynchronizedQueue 同步队列
只能存一个元素,只有元素为空的时候才能put进,只有取出元素才能进行put值
代码理解:
package com.queue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
SynchronousQueue<String> synchronousQueue = new SynchronousQueue<>();
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+" put 1");
synchronousQueue.put("1");
System.out.println(Thread.currentThread().getName()+" put 2");
synchronousQueue.put("2");
System.out.println(Thread.currentThread().getName()+" put 3");
synchronousQueue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
},"T1").start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
System.out.println(synchronousQueue.take());
TimeUnit.SECONDS.sleep(2);
System.out.println(synchronousQueue.take());
TimeUnit.SECONDS.sleep(2);
System.out.println(synchronousQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
},"T2").start();
}
}
运行结果: