為什么用線程池
? ??????(1)降低資源的消耗椭豫;(2)提高響應(yīng)速度;(3)提高線程的可管理性
合理配置線程池
? ??????首先要確定任務(wù)的特性拌屏。Cpu密集型(配置的線程數(shù)最大不要超過cpu的核心數(shù)加1);io密集型(cup核心數(shù)*2比較合適。Nthreads=NCPU*UCPU*(1+W/C) NCPU是cpu核心數(shù)量亭敢,UCPU是期望的CPU利用率(該值介于0和1之間)W/C是等待時(shí)間與計(jì)算時(shí)間的比率);混合型(如何可以拆分將其拆分成一個(gè)cpu密集型和io密集型图筹,如果執(zhí)行時(shí)間相差太大帅刀,則沒必要分解)。獲得cup核心數(shù)的方法Runtime.getRuntime().availableProcessors().
????????使用ScheduleThreadPoolExecutor四種執(zhí)行方式:只執(zhí)行一次schedule远剩;固定延時(shí)時(shí)間間隔執(zhí)行的任務(wù)scheduleWithFixedDelay扣溺;固定時(shí)間間隔執(zhí)行的任務(wù)scheduleAtFixedRate;
????????schedule如果不用try catch的話會(huì)吞掉異常瓜晤,一定要用try catch锥余。
Executor使用流程(見圖)
CompletionService作用
? ??????誰先執(zhí)行完就可以拿到先執(zhí)行完的結(jié)果。
誰先執(zhí)行完就可以拿到先執(zhí)行完的結(jié)果笋籽。