zookeeper实现阻塞式队列

在上一个基础上实现阻塞式队列,拿不到队列数据时,进行阻塞直到拿到数据,继承之前的类对poll方法升级,在队列为空时利用CounDownLatch进行await阻塞,并加入监听子节点变化的事件,coundown()解除阻塞

  @Override
    public T poll() throws InterruptedException, KeeperException {
        boolean flag=true;
        while (flag){
            //结束在latch上的等待,再来一次
            final CountDownLatch latch=new CountDownLatch(1);

            final Watcher childListener=new Watcher() {
                @Override
                @SneakyThrows
                public void process(WatchedEvent event) {
                    //监听子节点列表的  变更情况
                    if (event.getType()==Event.EventType.NodeChildrenChanged){
                        //队列变化
                        latch.countDown();
                    }
                    //重新绑定监听
                    zkClient.getChildren(root,this);
                }
            };
            zkClient.getChildren(root,childListener);
            try {
               T node=super.poll(); //调用父类的poll方法获取队列数据
               if(node!=null){
                   return node;
               }else {
                   //拿不到队列数据则在latch里await
                   latch.await();
               }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return null;
    }

当队列空时会阻塞,直到有数据才解开阻塞

请添加图片描述

非阻塞式(返回null)与阻塞式相比,后者是让CPU自旋,前者返回空后依然会执行后面的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值