要求:每一个put操作必须要等待一个take操作,否则不能继续添加元素,反之亦然
可知SynchronousQueue是BlockingQueue接口的实现类,是一个不存储元素的阻塞队列,也即单个元素的队列(有且只有一个)
public class SynchronousQueueDemo {
public static void main(String[] args) {
BlockingQueue<String> blockingQueue=new SynchronousQueue<>();
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+"\t put 1");
blockingQueue.put("1");
System.out.println(Thread.currentThread().getName()+"\t put 2");
blockingQueue.put("2");
System.out.println(Thread.currentThread().getName()+"\t put 3");
blockingQueue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
},"AAA").start();
new Thread(()->{
try {
try {TimeUnit.SECONDS.sleep(5);}catch (InterruptedException e){e.printStackTrace();}
System.out.println(Thread.currentThread().getName()+"\t"+blockingQueue.take());
try {TimeUnit.SECONDS.sleep(5);}catch (InterruptedException e){e.printStackTrace();}
System.out.println(Thread.currentThread().getName()+"\t"+blockingQueue.take());
try {TimeUnit.SECONDS.sleep(5);}catch (InterruptedException e){e.printStackTrace();}
System.out.println(Thread.currentThread().getName()+"\t"+blockingQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
},"BBB").start();
}
}
运行结果:
AAA put 1
BBB 1
AAA put 2
BBB 2
AAA put 3
BBB 3
BlockingQueue接口方法:
- put(e)方法:当阻塞队列满时,生产者线程继续往队列里put元素,队列会一直阻塞生产线程直take数据或者响应中断结束
- take()方法:当阻塞队列空时,消费者线程试图从队列里take元素,队列会一直阻塞消费者线程直到队列可用
又由于SynchronousQueue阻塞队列只能存储单个元素,因此AAA线程每put一次操作都会被阻塞,等待BBB线程将数据take,这样就完成了功能的实现
标注:
BlockingQueue核心方法?
抛出异常型 | 特殊值型 | 阻塞型 | 超时型 | |
---|---|---|---|---|
插入 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
移除 | remove | poll() | take() | put(time,unit) |
检查 | element() | peek() |