首頁 > 軟體

Java執行緒池佇列LinkedTransferQueue範例詳解

2022-12-11 14:00:33

正文

public enum QueueTypeEnum {
    ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue"),
    LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue"),
    DELAY_QUEUE(3, "DelayQueue"),
    PRIORITY_BLOCKING_QUEUE(4, "PriorityBlockingQueue"),
    SYNCHRONOUS_QUEUE(5, "SynchronousQueue"),
    LINKED_TRANSFER_QUEUE(6, "LinkedTransferQueue"),
    LINKED_BLOCKING_DEQUE(7, "LinkedBlockingDeque"),
    VARIABLE_LINKED_BLOCKING_QUEUE(8, "VariableLinkedBlockingQueue"),
    MEMORY_SAFE_LINKED_BLOCKING_QUEUE(9, "MemorySafeLinkedBlockingQueue");
}

LinkedTransferQueue

無界阻塞佇列LinkedTransferQueue,此佇列也是基於連結串列實現,對於所有給定的元素都是先入先出的。LinkedTransferQueue可以算是 LinkedBolckingQueue 和 SynchronousQueue 的合體。SynchronousQueue 內部無法儲存元素,當要新增元素的時候,需要阻塞。

LinkedBolckingQueue 則內部使用了大量的鎖,效能有所下降。

public class LinkedTransferQueue<E> extends AbstractQueue<E>
    implements TransferQueue<E>, java.io.Serializable {

相對於其他阻塞佇列,LinkedTransferQueue多了 tryTransfer(E e)和transfer(E e) 方法。

public interface TransferQueue<E> extends BlockingQueue<E> {
    // 如果可能,立即將元素轉移給等待的消費者。 
    // 更確切地說,如果存在消費者已經等待接收它(在 take 或 timed poll(long,TimeUnit)poll)中,則立即傳送指定的元素,否則返回 false。
    boolean tryTransfer(E e);
    // 將元素轉移給消費者,如果需要的話等待。 
    // 更準確地說,如果存在一個消費者已經等待接收它(在 take 或timed poll(long,TimeUnit)poll)中,則立即傳送指定的元素,否則等待直到元素由消費者接收。
    void transfer(E e) throws InterruptedException;
    // 上面方法的基礎上設定超時時間
    boolean tryTransfer(E e, long timeout, TimeUnit unit) throws InterruptedException;
    // 如果至少有一位消費者在等待,則返回 true
    boolean hasWaitingConsumer();
    // 返回等待消費者人數的估計值
    int getWaitingConsumerCount();
}

LinkedTransferQueue 消費者執行緒獲取取資料時:呼叫take poll 等方法

如果佇列不為空,則直接取走資料,若佇列為空則消費者執行緒會生成一個佔位虛擬節點(節點元素為null)入隊,並等待在這個節點上,後面生產者執行緒請求新增資料時,會從單向連結串列的head節點開始遍歷,如果發現某個節點是一個取數請求任務型別的節點(即是這個節點的isData為false,item == null),生產者執行緒就不入隊了,直接就將元素填充到該節點(元素傳遞給它),並喚醒該節點等待的消費者執行緒,被喚醒的消費者執行緒取走元素。

tryTransfer(E e)方法

tryTransfer(E e) 當生產者執行緒呼叫tryTransfer方法時,如果沒有消費者等待接收元素,則會立即返回false。該方法和transfer方法的區別就是tryTransfer方法無論消費者是否接收,方法立即返回,而transfer方法必須等到消費者消費後才返回。

tryTransfer(E e, long timeout, TimeUnit unit) 加上了限時等待功能,如果沒有消費者消費該元素,則等待指定的時間再返回;如果超時還沒消費元素,則返回false,如果在超時時間內消費了元素,則返回true。

transfer(E e)方法

transfer方法,用於將指定元素e傳遞給消費者執行緒(呼叫take/poll方法)。如果有消費者執行緒正在阻塞等待,則呼叫transfer方法的執行緒會直接將元素傳遞給它;

如果沒有消費者執行緒等待獲取元素,則呼叫transfer方法的執行緒會將元素插入到隊尾,然後阻塞等待,直到出現一個消費者執行緒獲取元素。

以上就是Java執行緒池佇列LinkedTransferQueue範例詳解的詳細內容,更多關於Java LinkedTransferQueue的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com