線程池的三種隊列區別:SynchronousQueue、LinkedBlockingQueue 和ArrayBlockingQueue 1.SynchronousQueue(CachedThreadPool) 類似交警只是指揮車輛,並不管理車輛 SynchronousQueue沒有容量,是無緩沖等待隊列,是一個不存儲元素的阻塞隊列,會直接將任務交給消費者,必須等隊列中的添加元素被消費后才能繼續添加新的元素。 超出直接corePoolSize個任務,直接創建新的線程來執行任務,直到(corePoolSize+新建線程)> maximumPoolSize。不是核心線程就是新建線程。 2.LinkedBlockingQueue(single,fixed)類似小倉庫,暫時存儲任務,待系統有空的時候再取出執行 BlockingQueue是雙緩沖隊列。BlockingQueue內部使用兩條隊列,允許兩個線程同時向隊列一個存儲,一個取出操作。在保證並發安全的同時,提高了隊列的存取效率。 LinkedBlockingQueue是一個無界緩存等待隊列。當前執行的線程數量達到corePoolSize的數量時,剩余的元素會在阻塞隊列里等待。(所以在使用此阻塞隊列時maximumPoolSizes就相當於無效了),每個線程完全獨立於其他線程。生產者和消費者使用獨立的鎖來控制數據的同步,即在高並發的情況下可以並行操作隊列中的數據。 3.ArrayBlockingQueue ArrayBlockingQueue是一個有界緩存等待隊列,可以指定緩存隊列的大小,當正在執行的線程數等於corePoolSize時,多余的元素緩存在ArrayBlockingQueue隊列中等待有空閑的線程時繼續執行,當ArrayBlockingQueue已滿時,加入ArrayBlockingQueue失敗,會開啟新的線程去執行,當線程數已經達到最大的maximumPoolSizes時,再有新的元素嘗試加入ArrayBlockingQueue時會報錯