應用線程池

應用線程池
一、任務與執行策略之間的隱性耦合。
1、有些類型的任務需要明確一個執行的策略,包括:
1)依賴的任務
2)使用線程限制的任務
3)對響應時間敏感的任務
4)使用ThreadLocal的任務
2、線程飢餓死鎖(Thread starvation dead)
如果線程中一個任務依賴於其他任務的執行,就可能產生死鎖。
3、耗時操作
解決方法:設置阻塞操作的超時時間,如Thread.join, BlockingQueue.put, CountDownLatch.await, Selector.select

二、設置線程池的大小
1、避免線程池的長度硬編碼,需要考慮計算環境,資源預算和任務的自身特性
2、公式及定義

三、配置ThreadPoolExecutor
1、ThreadPoolExecutor爲Executor提供基本的實現,可以通過它構造自己的Executor。
2、線程的創建與銷燬,ThreadPoolExecutor的構造函數的幾個參數:corePoolSize,maximumPoolSize,keepAliveTime
3、管理隊列任務
ThreadPoolExecutor允許提供一個BlockingQueue來持有等待執行的任務。
任務排隊的方式有三種: 無限隊列,有限隊列,同步移交
如何避免資源耗盡。
4、飽和策略
1)通過setRejectedExecutionHandler來修改ThreadPoolExecutor的飽和策略。
2)JDK提供了幾種不同的RejectedExecutionHandler的實現,實現了不同的策略AbortPolicy,CallerRunsPolicy,DiscardPolicy,DiscardOldestPolicy
AbortPolicy :引起execute拋出未檢查的RejectedExecutionException,調用者可以捕獲這個異常,進行處理
DiscardPolicy:當新提交的任務不能進入隊列等待執行的時候,discard會默認放棄這個任務。
DiscardOldestPolicy:策略選擇丟棄的任務,放棄即將執行的任務,重新提交新任務。
CallerRunsPolicy:既不拋異常,也不拋棄任務。它把一些任務退回給調用者,以減緩任務流。
3)使用semaphore來抑制任務提交。
4)線程工廠ThreadFactory,接口只有一個方法newFactory
5、擴展ThreadPoolExecutor
1)提供幾個函數讓子類去重寫 beforeExecute(),afterExecute(),terminate()
無論任務是從run()中返回,還是拋出異常,afterExecute都會被執行;
如果beforeExecute拋出一個runtimeException,任務將不被執行,afterExecute也不會被調用。
terminate 在線程池完成關閉後調用。
6、並行遞歸算法
1)順序執行改爲並行執行。
2)謎題框架

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章