1烟馅、Java線程池實現了一個Java高并發(fā)的笔横、Java多線程的铃芦、可管理的統(tǒng)一調度器涮较。空間換時間的原則
? ? ? ? 首先是java.util.concurrent.Executors 工作中最常用和最熟知的啤誊。
? ? ? ? Executors岳瞭,是一個線程的工廠類,方便快速地創(chuàng)建很多線程池蚊锹,也可以說是一個線程池的工具類瞳筏,配置一個線程池是比較復雜的,尤其是對于線程池的原理并不是很清楚的情況下牡昆,很有可能配置的線程池不是最優(yōu)的姚炕,因此,在Executors類里面提供了一些靜態(tài)工廠類丢烘,生成一些常用的線程池柱宦,常用的線程池有一下三種:
? ????? (1)、newSingleThreadExecutor:創(chuàng)建一個單線程的線程池
? ? ????(2)铅协、newFixedThreadPool:創(chuàng)建固定大小的線程池? ?ThreadPoolExecutor
? ????? (3)捷沸、newCachedThreadPool:創(chuàng)建一個可緩存的線程池
? ? ? ? 首先看一下ThreadPoolExecutor挑一個最復雜的構造來講
? ? 1摊沉、corePoolSize:核心線程池狐史,剛創(chuàng)建的條件下,線程池中沒有線程说墨,除非調用prestartAllCoreThreads方法或者prestartCoreThread方法骏全,預創(chuàng)建線程,即任務沒到來之前尼斧,就創(chuàng)建核心線程池姜贡,在默認條件下,創(chuàng)建了線程池后棺棵,線程池中的線程為0楼咳,當有任務來到之后熄捍,就會創(chuàng)建一個線程去執(zhí)行,當線程中的線程數目達到corePoolSize后母怜,就會把達到的人物放到緩存隊列中余耽;
? ? 2、maximumPoolSize:線程池最大線程數苹熏,表示線程池中最多能創(chuàng)建多少個線程碟贾,超過corePoolSize的線程在完成執(zhí)行完成,并超過生存時間之后會被自動釋放
? ? 3轨域、keepAliveTime:表示線程沒有任務執(zhí)行時袱耽,最多保持多久時間會被終止。默認條件下干发,線程數大于corePoolSize的線程朱巨,在沒有空閑時間超過keepAliveTime時間后,就會被消除枉长,但是蔬崩,如果強行調用allowCoreThreadTimeOut(boolean)方法,線程池中線程數不大于corePoolSize時搀暑,也會釋放未執(zhí)行任務的線程沥阳,知道線程數為0
? ? 4、TimeUnit:keepAliveTime的時間的單位
? ? 5自点、BlockingQueue:阻塞隊列桐罕,用來存儲等待執(zhí)行的任務,這個參數往往會對線程池產生重大影響桂敛,就是前面講過的幾種選擇
? ? 6功炮、ThreadFactory:線程工廠,主要用來創(chuàng)建線程术唬,默認就是Executors.defaultThreadFactory()薪伏,用來創(chuàng)建里面的線程。
? ? 7粗仓、RejectedExecutionHandler:表示當拒絕處理任務時的策略嫁怀,也是可以自定義的
線程池的拒絕策略:
? ? 如果線程池的線程已經飽和,并且任務隊列也已經滿借浊,那么就需要做丟棄處理塘淑,RejectedExecutionHandler這個類就是用來處理被丟棄的線程的異常處理接口;
? ? JDK里面RejectedExecutionHandler提供了4中方式來處理任務拒絕策略
? ? ? ? AbortPolicy:直接拋出異常蚂斤;
? ? ? ? CallerRunsPolicy:只用調用者所在線程來運行任務
? ? ? ? DiscardOldestPolicy:丟棄隊列里最近的一個任務存捺,并執(zhí)行當前任務
? ? ? ? DiscardPolicy:不處理,丟棄掉