1. 程式人生 > >怎麼理解無界佇列和有界佇列

怎麼理解無界佇列和有界佇列

有界佇列:就是有固定大小的佇列。比如設定了固定大小的 LinkedBlockingQueue,又或者大小為 0,只是在生產者和消費者中做中轉用的 SynchronousQueue。

無界佇列:指的是沒有設定固定大小的佇列。這些佇列的特點是可以直接入列,直到溢位。當然現實幾乎不會有到這麼大的容量(超過 Integer.MAX_VALUE),所以從使用者的體驗上,就相當於 “無界”。比如沒有設定固定大小的 LinkedBlockingQueue。

所以無界佇列的特點就是可以一直入列,不存在佇列滿負荷的現象。這個特性,在我們自定義執行緒池的使用中非常容易出錯。而出錯的根本原因是對執行緒池內部原理的不瞭解。

比如有這麼一個案例,我們使用了無界佇列建立了這樣一個執行緒池:

ExecutorService executor =  new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

配置的引數如下:

核心執行緒數 2
最大執行緒數 4
空閒執行緒保活時間 60s
使用無界佇列 LinkedBlockingQueue

PS:我們這裡的佇列都指執行緒池使用的阻塞佇列 BlockingQueue 的實現。