(文章本人原創,若轉載請注明出處)
在JDK1.5提供了一個線程池ThreadPoolExecutor,可以處理用戶提交過來的線程。如果把要處理的任務比作蓋一個大樓,那么每一個建筑工人就相當于一個線程,那么這個ThreadPoolExecutor就好像包工頭,它來控制蓋這個大樓需要多少個工人,何時招進新工人,何時辭退已經長時間沒有事做的工人,等等此類事務。也就是說用戶程序不斷提交新的線程,ThreadPoolExecutor執行提交線程的同時會控制目前總共同時執行的線程數,銷毀已執行完閑置的線程等控制行為,保留最少閑置線程數,并且可以配置不同的處理策略。
為什么要使用線程池呢,這與數據庫連接池的原理有點相仿,線程的創建是需要成本的,包括服務器CPU和內存資源,由于多線程是并行運行,程序運行過程中可能有的線程已經完成自身處理任務,處于閑置狀態,如果在這種情況下再不斷創建新任務就是在浪費服務器資源,此時應該盡量使用先前創建的好的并且是處理閑置狀態的線程來處理新任務,而線程池就可以有效的對此進行自動化管理,當然這個管理是可以由用戶配置的。
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
這是線程池的構建器,用戶程序通過這個構建器傳參數,corePoolSize是線程池中核心線程數,運行的線程數不能少于這個核心線程數,否則就新建線程。maximumPoolSize是充許最大的線程數。keepAliveTime設置除核心線程外其它線程的空閑時間,超過這個時間線程就自動終止。unit是指的keepAliveTime的時間單位。BlockingQueue接口按生產則消費者算法設計的一個線程池內部處理線程隊列的接口,有三種實現SynchronousQueue、LinkedBlockingQueue和ArrayBlockingQueue,在實際運行程序時可以根據這三種實現得到不同的性能,比如有的實現可能在有新任務來時不新建線程,而是將其加入等待隊列,等有線程運行完時再分配給其使用。具體實現還是參看它們的JDK文檔吧,這里站在使用的角度它們是可以調整運行性能的開關。當最大線程和工作隊列容量都達到最大值時,再提交給線程池新任務就會被拒絕,此時線程池會調用RejectedExecutionHandler 接口進行處理,具體實現有四種策略。我們只需要選用其中一種在構建ThreadPoolExecutor時傳入即可。具體四種實現還是參看JDK文檔吧。關于ThreadPoolExecutor的JDK文檔。至此控制線程池運作的幾個參數都從構建器中傳入了。
posted on 2009-03-19 22:26
依然Fantasy 閱讀(848)
評論(0) 編輯 收藏