LinkedBlockingQueue中的put/take方法简单使用

在一些小项目中有时候会使用LinkedBlockingQueue作为本地的缓存队列,LinkedBlockingQueue中有两个方法比较常使用,分别为put()和take()。

put()方法向队列中生产数据,当队列满时,线程阻塞

take()方法从队列中消费数据,当队列为空是,线程阻塞

简单的使用例子:

/**
     * 阻塞队列
     */
    private static LinkedBlockingQueue frameTaskQueue = new LinkedBlockingQueue(500);

    /**
     * <将消息放入队列中,若当前队列满,线程阻塞>
     *
     * @param msg msg
     * @throws
     */
    public static void produce(String msg) throws InterruptedException {
        LOGGER.info("start to produce msg.");
        frameTaskQueue.put(msg);
    }

    /**
     * <消费队列中数据,若当前队列无数据,线程阻塞>
     *
     * @return 消息
     * @throws
     */
    public static String consume() throws InterruptedException {
        return (String)frameTaskQueue.take();
    }

 

LinkedBlockingQueue的take()是一个方法,用于获取并移除队列头部的元素。如果队列为空,take()方法会阻塞直到有可用元素为止。 在实现上,LinkedBlockingQueue使用了链表结构来存储元素,并且是一个无界队列,即默认上限是Integer.MAX_VALUE。当调用take()方法时,它会首先获取takeLock,然后通过判断队列是否为空来决定是否等待。如果队列为空,调用notEmpty.await()方法使当前线程进入等待状态,直到其他线程调用了notEmpty.signal()方法来唤醒它。当队列非空时,take()方法会从头部取出一个元素,然后更新队列的状态并返回取出的元素。最后,如果队列之前满的情况下,take()方法会调用signalNotFull()方法来唤醒可能在put()方法等待的线程。 总结起来,LinkedBlockingQueue的take()方法用于从队列获取并移除头部元素,如果队列为空则会阻塞等待其他线程的唤醒。这个方法在多线程环境下可以用于实现生产者-消费者模式,其一个线程负责往队列放入元素,而另一个线程负责从队列取出元素进行处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [LinkedBlockingQueue的put/take方法简单使用](https://blog.csdn.net/wangchaox123/article/details/100529527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java容器.xmind](https://download.csdn.net/download/weixin_42404109/11689852)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [LinkedBlockingQueue put方法和take方法](https://blog.csdn.net/Andy_Health/article/details/110071044)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值