一、線程池阻塞隊列有哪幾種
線程池阻塞隊列有四種類型的阻塞隊列:
- 無界隊列
- 有界隊列
- 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
微信掃一掃
支付寶掃一掃