一、線程池阻塞隊列有哪幾種
線程池阻塞隊列有四種類型的阻塞隊列:
- 無界隊列
- 有界隊列
- SynchronousQueue
- DelayQueue
二、線程池阻塞隊列的選擇
根據業務特點,我們需要選擇合適的阻塞隊列類型。如果線程池的線程數是無限的,可以選擇無界隊列;如果線程池的線程數是有限的,可以選擇有界隊列或SynchronousQueue;如果需要實現延遲執行任務,可以選擇DelayQueue。
三、線程池阻塞隊列的概念
線程池阻塞隊列是指在任務提交到線程池後,如果線程池的線程數量已經達到最大值,那麼剩餘的任務將會被放到一個阻塞隊列中,這個隊列就是線程池的阻塞隊列。
四、線程池阻塞隊列大小設置
線程池阻塞隊列大小設置與業務需求有關。如果業務中提交的任務量較大,可以適當增加隊列大小,以避免任務被拒絕。但是要注意,隊列過大可能會導致oom,因此需要在合理的範圍內設置隊列大小。
五、線程池阻塞隊列源碼
public interface BlockingQueue extends Queue { //添加元素到隊尾,如果隊列已滿,將會阻塞 void put(E e) throws InterruptedException; //從隊頭獲取元素,如果隊列為空,將會阻塞 E take() throws InterruptedException; } public class LinkedBlockingQueue extends AbstractQueue implements BlockingQueue, Serializable { //默認隊列大小為Integer.MAX_VALUE public LinkedBlockingQueue() { this(Integer.MAX_VALUE); } //指定隊列大小 public LinkedBlockingQueue(int capacity) { if (capacity <= 0) throw new IllegalArgumentException(); this.capacity = capacity; last = head = new Node(null); } private static class Node { E item; Node next; Node(E x) { item = x; } } //添加元素到隊尾,如果隊列已滿,將會阻塞 public void put(E e) throws InterruptedException { if (e == null) throw new NullPointerException(); int c = -1; Node node = new Node(e); final ReentrantLock putLock = this.putLock; final AtomicInteger count = this.count; putLock.lockInterruptibly(); try { while (count.get() == capacity) { notFull.await(); } enqueue(node); c = count.getAndIncrement(); if (c + 1 1) notEmpty.signal(); } finally { takeLock.unlock(); } if (c == capacity) signalNotFull(); return x; } }
六、線程池阻塞隊列與拒絕策略
線程池阻塞隊列與拒絕策略是相輔相成的,當任務提交到線程池後,如果線程池中的線程已經達到最大值並且線程池阻塞隊列已經滿了,就需要使用拒絕策略處理剩餘的任務。
七、線程池阻塞隊列的作用
線程池阻塞隊列的作用是緩存任務,避免任務被拒絕。當線程池中的線程數量已經達到最大值後,剩餘的任務就會放到阻塞隊列中等待處理。
八、線程池阻塞隊列導致oom
線程池阻塞隊列如果過大,可能會導致oom。因此,在設置隊列大小時需要注意避免過大。
九、線程池阻塞隊列滿了
當線程池阻塞隊列滿了,新提交的任務就會被拒絕。此時可以使用拒絕策略來處理剩餘的任務。
十、線程池阻塞隊列的長度選取
選擇線程池阻塞隊列的長度應該考慮業務需求。如果任務量很大,可以適當增加隊列大小;如果希望更快的響應任務,可以適當減小隊列大小。
原創文章,作者:DGBM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/141976.html