溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行LinkedBlockingQueue的put操作

發(fā)布時間:2021-12-23 17:09:07 來源:億速云 閱讀:94 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)如何進行LinkedBlockingQueue的put操作,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

JDK提供了7大阻塞隊列,常用于實現(xiàn)生產(chǎn)者和消費者,LinkedBlockingQueue是最常用之一.

public void put(E e) throws InterruptedException {    if (e == null) throw new NullPointerException();    int c = -1;    Node<E> node = new Node<E>(e);    final ReentrantLock putLock = this.putLock;    final AtomicInteger count = this.count;    // 可中斷的獲取鎖操作,即線程由于未獲取到鎖而處于Blocked狀態(tài)時,線程可以被中斷而不再繼續(xù)等待.    putLock.lockInterruptibly();    try {        // 如果隊列中元素數(shù)量和隊列容量相等,即此時隊列已經(jīng)滿了,則當(dāng)前線程需要等待.        // 之所以使用while循環(huán),是當(dāng)線程被喚醒之后,依然需要判斷隊列是否滿.        // 即只有隊列不滿的情況下,當(dāng)前線程才可以添加元素                while (count.get() == capacity) {            notFull.await();        }        // 入隊,即添加元素        enqueue(node);        c = count.getAndIncrement();        if (c + 1 < capacity)            // 通知其他生產(chǎn)者            notFull.signal();    } finally {        putLock.unlock();    }    if (c == 0)        // 通知消費者        signalNotEmpty();}

總結(jié)一下添加操作流程

1.獲取putLock鎖2.如果隊列已滿, 則等待(notFull.await())3.元素入隊4.當(dāng)前生產(chǎn)者添加元素之后如果隊列還沒有滿, 則通知其他生產(chǎn)者添加元素(notFull.signal())5.釋放putLock鎖6.如果隊列中已經(jīng)有元素,則通知消費者

首先是獲取鎖,拿到鎖之后,如果隊列滿了則等待,如果隊列不滿則添加元素,

添加元素之后,如果隊列還沒有滿,則通知其他生產(chǎn)者

添加元素之后,如果隊列已經(jīng)有元素了,則通知消費者

關(guān)于如何進行LinkedBlockingQueue的put操作就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI