實(shí)現(xiàn)方式
1. 繼承Thread類
2. 實(shí)現(xiàn)Runnable接口
兩種方法的區(qū)別:Thread其實(shí)也是實(shí)現(xiàn)了Runable接口吼蚁,底層由JVM通過(guò)Native Code啟動(dòng)線程茬祷。主要的區(qū)別:
1.? Java的類可以實(shí)現(xiàn)多個(gè)接口,不能多繼承财破。所以Runable比Thread靈活笛厦。
2.? 同樣的業(yè)務(wù)邏輯可以封裝在Runnable的run方法里铆铆,然后用多線程去執(zhí)行,或者提交線程池執(zhí)行傀顾,但是注意多線程帶來(lái)的數(shù)據(jù)不一致的問(wèn)題襟铭。
線程池
ThreadPoolExecutor根據(jù)corePoolSize和maxPoolSize兩個(gè)參設(shè)置線程池的大小。當(dāng)新任務(wù)調(diào)用execute()方法提交任務(wù)時(shí)短曾,如果正在運(yùn)行線程數(shù)小于corePoolSize, 則創(chuàng)建新的線程處理請(qǐng)求寒砖,如果正在運(yùn)行的線程數(shù)等于corePoolSize, 新任務(wù)會(huì)添加到隊(duì)列中,直到隊(duì)列滿嫉拐,會(huì)開(kāi)辟新的線程來(lái)處理任務(wù)哩都,但是不超過(guò)最大線程設(shè)置maxPoolSize。當(dāng)任務(wù)隊(duì)列滿婉徘,并且線程數(shù)等于maxPoolSize的時(shí)候漠嵌,就會(huì)根據(jù)拒絕策略拒絕請(qǐng)求咐汞。
如果線程空閑超過(guò)keepAliveTime, 非核心線程就會(huì)被收回,若allowCoreThreadTimeOut為true儒鹿,則核心線程也會(huì)被收回化撕。默認(rèn)情況核心線程不會(huì)被收回。
Executors.FixedThreadPool 默認(rèn)corePoolSize = maxPoolSize,?keepAliveTime=0L约炎, 隊(duì)列采用LinkedBlockingQueue植阴。其實(shí)根據(jù)隊(duì)列的不同類型,還可以實(shí)現(xiàn)優(yōu)先級(jí)等高級(jí)功能
1. AbortPolicy
拒絕策略:拋出運(yùn)行時(shí)異常RejectedExecutionException
這種策略丟棄任務(wù)圾浅,并拋出異常
2. DiscardPolicy
拒絕策略:不能執(zhí)行的任務(wù)將被丟棄掠手。這種策略什么都沒(méi)做
3. DiscardOldestPolicy
拒絕策略:如果執(zhí)行程序尚未關(guān)閉,則位于工作隊(duì)列頭部的任務(wù)將被刪除贱傀,然后重試執(zhí)行程序。
該策略稍微復(fù)雜一些伊脓,在pool沒(méi)有關(guān)閉的前提下首先丟掉緩存在隊(duì)列中的最早的任務(wù)府寒,然后重新嘗試運(yùn)行該任務(wù)
4. CallerRunsPolicy
拒絕策略:線程調(diào)用運(yùn)行該任務(wù)的 execute 本身。此策略提供簡(jiǎn)單的反饋控制機(jī)制报腔,能夠減緩新任務(wù)的提交速度
該策略不想放棄執(zhí)行任務(wù)株搔。但是由于池中已經(jīng)沒(méi)有任何資源了,那么就直接使用調(diào)用該execute的線程本身來(lái)執(zhí)行纯蛾。
如何確定線程池的大小
根據(jù)服務(wù)的類型纤房,比如CPU, IO,或者混合類型來(lái)設(shè)置線程池的大小翻诉。
1. 如果是CPU密集型應(yīng)用炮姨,則線程池大小設(shè)置為N+1
2. 如果是IO密集型應(yīng)用,則線程池大小設(shè)置為2N+1
如果一臺(tái)服務(wù)器上只部署這一個(gè)應(yīng)用并且只有這一個(gè)線程池碰煌,那么這種估算或許合理
最佳線程數(shù)目 = ((線程等待時(shí)間+線程CPU時(shí)間)/線程CPU時(shí)間 )* CPU數(shù)目
比如平均每個(gè)線程CPU運(yùn)行時(shí)間為0.5s舒岸,而線程等待時(shí)間(非CPU運(yùn)行時(shí)間,比如IO)為1.5s芦圾,CPU核心數(shù)為8蛾派,那么根據(jù)上面這個(gè)公式估算得到:((0.5+1.5)/0.5)*8=32。這個(gè)公式進(jìn)一步轉(zhuǎn)化為:
最佳線程數(shù)目 = (線程等待時(shí)間與線程CPU時(shí)間之比 + 1)* CPU數(shù)目
可以得出一個(gè)結(jié)論:線程等待時(shí)間所占比例越高个少,需要越多線程洪乍。線程CPU時(shí)間所占比例越高,需要越少線程夜焦。