執行緒池中為什麼要使用阻塞佇列?

2021-08-08 00:09:42 字數 1294 閱讀 9456

在乙個task提交到執行緒池時,假設可以被執行緒池中的乙個執行緒執行,則進行以下過程:

exeute ---》addworker(runnable command, boolean core)---》workers.add(w),啟動執行緒執行任務(獲取全域性鎖reentrantlock mainlock)

具體原始碼如下:

public void execute(runnable command) 

//如果當前執行的執行緒數大於等於corepoolsize或者執行緒建立失敗

//則把當前任務放入工作佇列

if (isrunning(c) && workqueue.offer(command))

//如果執行緒池任務無法加入到工作佇列(說明工作佇列滿了)

//建立乙個執行緒執行任務。如果新建立後當前執行的執行緒數大於

//maximumpoolsize則拒絕執行任務

else if (!addworker(command, false))

reject(command);

}

private boolean addworker(runnable firsttask, boolean core)

} finally

if (workeradded)

}} finally

return workerstarted;

}

上述**中:

w = new worker(firsttask);

final thread t = w.thread;

worker實現了runnable介面,裡面定義了乙個final變數thread thread

worker的建構函式為:

worker(runnable firsttask)
run函式為:

public void run()
final void runworker(worker w)  finally 

}completedabruptly = false;

} finally

}

看完上述**後,我們可以得出:

執行緒池建立執行緒需要獲取mainlock這個全域性鎖,影響併發效率,阻塞佇列可以很好的緩衝。

另外一方面,如果新任務的到達速率超過了執行緒池的處理速率,那麼新到來的請求將累加起來,這樣的話將耗盡資源。

為什麼要使用訊息佇列

參考 訊息佇列本身有確認訊息被正確消費的機制 4.2message acknowledgment訊息確認 為了保證資料不被丟失,rabbitmq支援訊息確認機制,為了保證資料能被正確處理而不僅僅是被consumer收到,那麼我們不能採用no ack,而應該是在處理完資料之後傳送ack.在處理完資料之...

為什麼要使用訊息佇列?

在實際的專案實踐中,訊息佇列有的使用還是比較常用的,有時在想訊息佇列的好處是什麼,使用mq能帶來什麼好處。在說之前,目前市場主流的幾種mq activemq,rabbitmq,rocketmq,kafka 關於mq的入門就不說了,可以找下教程,寫個demo測試一下就好了,還是比較簡單的。先上張圖了解...

為什麼要使用訊息佇列

緩衝和削峰 上游資料時有突發流量,下游可能扛不住,或者下游沒有足夠多的機器來保證冗餘,kafka在中間可以起到乙個緩衝的作用,把訊息暫存在kafka中,下游服務就可以按照自己的節奏進行慢慢處理。解耦和擴充套件性 專案開始的時候,並不能確定具體需求。訊息佇列可以作為乙個介面層,解耦重要的業務流程。只需...