SynchronousQueue是一个即时的没有缓冲的队列,首先需要一个线程获取元素,队列中没有元素,线程就会等待,当另外一个线程往队列中添加元素后,前一个线程会获取到元素。
SynchronousQueue<String> sq = new SynchronousQueue<>();
sq.add("张三");
上面代码main中执行,直接报异常,因为没有线程给添加元素:
下面模拟一下正确的使用:
public static void main(String[] args) {
SynchronousQueue<String> sq = new SynchronousQueue<>();
new Thread(new Runnable() {
@Override
public void run() {
try {
String data = sq.take();
System.err.println("线程 "+ Thread.currentThread().getName() + " 获取到元素 " + data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t1").start();
new Thread(new Runnable() {
@Override
public void run() {
sq.add("张三");
System.err.println("线程 "+ Thread.currentThread().getName() + " 添加了元素 ");
}
},"t2").start();
}
执行结果为:
先执行t1线程,获取元素,因为没有元素,等待,再执行t2线程,添加元素后,t1线程获取到元素。