1. 程式人生 > 其它 >【面試題】說說執行緒池的底層工作原理可以嗎?

【面試題】說說執行緒池的底層工作原理可以嗎?

技術標籤:執行緒

系統不可能無限建立很多的執行緒,會構建一個執行緒池,有一定數量的執行緒,讓他們執行各種各樣的任務,執行緒執行完任務之後,不會銷燬自己,繼續等待執行下一個任務。

頻繁的建立執行緒、銷燬執行緒,會導致開銷浪費

ExecutorService threadPool = Executors.newFixedThreadPool(10);//10表示核心執行緒池數,corePoolSize
threadPool.submit(new Callable(){
    public void run(){
        
    }
});

執行緒池剛建立時,是沒有執行緒的,而且會自帶一個空的佇列(阻塞佇列)

佇列可以為無界佇列,也可以是有界佇列

當前執行緒數小於核心執行緒數時,當提交新任務過來後,會建立一個新的執行緒去執行任務,執行完了就嘗試從無界的LinkedBlockingQueue裡獲取新的任務,如果沒有新的任務,此時就會發生阻塞直到執行緒池裡有新的任務。

當前執行緒數已達到核心執行緒數時,當提交新任務過來時,會將任務放入阻塞佇列中。當有執行緒執行完任務後,不會直接銷燬,而是會爭搶獲取任務執行。如果所有執行緒此時都在執行任務,那麼無界佇列中的任務可能會越來越多。如果阻塞佇列是有限的,那麼當阻塞佇列滿了之後,會檢查核心執行緒池是否已滿,滿了,會建立額外的執行緒放入執行緒池中

相對於FixedThreadPool,它的佇列LinkedBlockingQueue無界阻塞佇列,就是說佇列是無限大的。