騰訊云服務(wù)器做網(wǎng)站網(wǎng)站建設(shè)總結(jié)
什么是線程池?
線程池:就是一個(gè)容納多個(gè)線程的容器,其中的線程可以反復(fù)使用,省去了頻繁創(chuàng)建線程對(duì)象的操作,無(wú)需反復(fù)創(chuàng)建線程而消耗過多資源。
為什么用線程池?
線程池的優(yōu)勢(shì):線程池做的工作主要是控制運(yùn)行的線程數(shù)量,處理過程中將任務(wù)放入隊(duì)列,然后在線程創(chuàng)建后啟動(dòng)這些任務(wù),如果線程數(shù)量超過了最大數(shù)量,超出數(shù)量的線程排隊(duì)等候,等其他線程執(zhí)行完畢,再?gòu)年?duì)列中取出任務(wù)來(lái)執(zhí)行。
線程池的主要特點(diǎn)為:線程復(fù)用;控制最大并發(fā)數(shù);管理線程。
- 降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。
- 提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等待線程創(chuàng)建就能立即執(zhí)行。
- 提高線程的可觀理性。線程是稀缺資源,如果無(wú)限制的創(chuàng)建,不僅會(huì)消耗系統(tǒng)資源,還會(huì)降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控。
線程池的使用
Java里面線程池的頂級(jí)接口是java.util.concurrent.Executor,但是嚴(yán)格意義上講Executor并不是一個(gè)線程池,而只是一個(gè)執(zhí)行線程的工具。真正的線程池接口是java.util.concurrent.ExecutorService。要配置一個(gè)線程池是比較復(fù)雜的,尤其是對(duì)于池的原理不是很清楚的情況下,很有可能配置的線程池不是較優(yōu)的,因此在java.util.concurrent.Executors線程工廠類里面提供了一些靜態(tài)工廠,生成一些常用的線程池。官方建議使用Executors工程類來(lái)創(chuàng)建線程池對(duì)象。
Executors類中創(chuàng)建線程池的方法如下:
- newFixedThreadPool創(chuàng)建一個(gè)固定長(zhǎng)度的線程池,當(dāng)?shù)竭_(dá)線程最大數(shù)量時(shí),線程池的規(guī)模將不再變化。一池有N個(gè)固定的線程。
- newSingleThreadPoolExecutor創(chuàng)建一個(gè)單線程的Executor,確保任務(wù)對(duì)了,串行執(zhí)行。一池一線程
- newCachedThreadPool創(chuàng)建一個(gè)可緩存的線程池,如果當(dāng)前線程池的規(guī)模超出了處理需求,將回收空的線程;當(dāng)需求增加時(shí),會(huì)增加線程數(shù)量;線程池規(guī)模無(wú)限制。動(dòng)態(tài)的創(chuàng)建線程,來(lái)了任務(wù)就創(chuàng)建線程運(yùn)行,當(dāng)線程空閑超過60秒,就銷毀線程。
- newScheduledThreadPool創(chuàng)建一個(gè)固定長(zhǎng)度的線程池,而且以延遲或者定時(shí)的方式來(lái)執(zhí)行,類似Timer。
線程池的execute方法和submit有什么區(qū)別
1、參數(shù)
- execute? ?Runnable
- submit? ? ?Callable
2、返回值
- execute? ?void
- submit? ? ?Future
3、異常
- execute? ?會(huì)在子線程中拋出異常,在主線程中鋪?zhàn)讲坏?/li>
- submit? ? ?不會(huì)立馬拋出異常,而是會(huì)將異常暫時(shí)存起來(lái),等Future.get()方法的時(shí)候才會(huì)拋出,可以在主線程捕捉,處理異常更方便
超級(jí)大坑? ?在工作中單一的/固定數(shù)的/可變的三種創(chuàng)建線程池的方法哪個(gè)用的多?
- 一個(gè)都不用,工作中只能使用自定義的。
線程池中的2個(gè)關(guān)閉方法
shutdown:線程池不再接口新任務(wù),內(nèi)部會(huì)將所有已提交的任務(wù)處理完畢,處理完畢之后,工作線程自動(dòng)退出。
shutdownNow:線程池會(huì)將還未處理的(在隊(duì)里等待處理的任務(wù))任務(wù)移除,將正在處理中的處理完畢之后,工作線程自動(dòng)退出。
至于調(diào)用哪個(gè)方法來(lái)關(guān)閉線程,應(yīng)該由提交到線程池的任務(wù)特性決定,多數(shù)情況下調(diào)用shutdown方法來(lái)關(guān)閉線程池,如果任務(wù)不一定要執(zhí)行完,則可以調(diào)用shutdownNow方法。