您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(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)容。