1. 程式人生 > >黑馬程式設計師7k面試題 執行緒池

黑馬程式設計師7k面試題 執行緒池

執行緒池的概念與Executors類的應用
首先介紹在TCP伺服器程式設計模型的原理,當一個客戶端連線到伺服器,伺服器要起一個執行緒為之服,當客戶端的回話結束時,執行緒也就結束了,即每一個客戶端連線,伺服器 就要為之建立一個新的執行緒,這好比假設每個報名學員都要通過我來親自接 待,以便給每個學員一種好的感覺,但每個學員報名手續花費半個小時,對於 50名學生,我一個個接待和為之辦手續,顯然是不實際的,那麼我會怎麼做呢 
?我會先接待每個學員,打完招呼後,再把他分配給一名工作人員去辦理手續 ,這樣我就接待了每一名學員.
         如果訪問伺服器的客戶端很多,那麼伺服器要不斷的建立和銷燬執行緒, 這樣將嚴重影響伺服器的效能,如果真的來一名學員,我們就安排一名新的 工作人員為之服務,這也是不可能的,那麼公司豈不是要招很多工作人員.

應該是一名工作人員服務完一名學員,空閒下來後,一旦有新的學員要服務, 
我們安排該工作人員,為之服務.
        執行緒池的概念於此類似,首先建立一些執行緒,他們的集合稱為執行緒池,
當伺服器接收到一個客戶請求後,就從執行緒池中取出一個空閒的執行緒為之服 
務,服務完成後不關閉該執行緒,而是將該執行緒還回到執行緒池中.
        線上程池的程式設計模式下,任務是交給整個執行緒池,而不是直接交給某個線 
程,執行緒池拿到任務偶,他就在內部找有空閒的執行緒,再把任務交給內部某個 
空閒的執行緒,這就是封裝.記住,任務是交給整個執行緒池,但可以同時向一個執行緒池中提交多個任務.
建立固定大小的執行緒池:

ExecutorService threadPool = Executors.newFixedThreadPool(3);
threadPool.execute(Runnable runnable);

建立快取的執行緒池:
如果執行緒不夠自動建立新的執行緒滿足服務
ExecutorService threadPool = Executors.newCachedThreadPool();
threadPool.execute(Runnable runnable);

建立單一執行緒池.
執行緒裡面只有一個執行緒,如果該執行緒意外死亡,那麼系統會自動建立一個新的執行緒來代替.
ExecutorService threadPool = Executors.newSingleThreadExecutor();

threadPool.execute(Runnable runnable);

//執行完任務後關閉執行緒池,
threadPool.shutdown();
//不管任務是否完成都關閉執行緒池
threadPool.shutdownNow();

用執行緒池啟動定時器.
Executors.newScheduledThreadPool(3).schedule(new Runnable(){
@Override
publicvoid run() {
}
}, 20, TimeUnit.SECONDS);