這篇文章將為大家詳細講解有關如何進行LinkedBlockingQueue的put操作,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
JDK提供了7大阻塞隊列,常用于實現生產者和消費者,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狀態時,線程可以被中斷而不再繼續等待. putLock.lockInterruptibly(); try { // 如果隊列中元素數量和隊列容量相等,即此時隊列已經滿了,則當前線程需要等待. // 之所以使用while循環,是當線程被喚醒之后,依然需要判斷隊列是否滿. // 即只有隊列不滿的情況下,當前線程才可以添加元素 while (count.get() == capacity) { notFull.await(); } // 入隊,即添加元素 enqueue(node); c = count.getAndIncrement(); if (c + 1 < capacity) // 通知其他生產者 notFull.signal(); } finally { putLock.unlock(); } if (c == 0) // 通知消費者 signalNotEmpty();}
總結一下添加操作流程
1.獲取putLock鎖2.如果隊列已滿, 則等待(notFull.await())3.元素入隊4.當前生產者添加元素之后如果隊列還沒有滿, 則通知其他生產者添加元素(notFull.signal())5.釋放putLock鎖6.如果隊列中已經有元素,則通知消費者
首先是獲取鎖,拿到鎖之后,如果隊列滿了則等待,如果隊列不滿則添加元素,
添加元素之后,如果隊列還沒有滿,則通知其他生產者
添加元素之后,如果隊列已經有元素了,則通知消費者
關于如何進行LinkedBlockingQueue的put操作就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。