阻塞队列——SynchronousQueue

要求:每一个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)
移除removepoll()take()put(time,unit)
检查element()peek()  

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值