java中多線程與線程池的基本使用方法
前言
在java中,如果每個(gè)請(qǐng)求到達(dá)就創(chuàng)建一個(gè)新線程,開(kāi)銷是相當(dāng)大的。在實(shí)際使用中,服務(wù)器在創(chuàng)建和銷毀線程上花費(fèi)的時(shí)間和消耗的系統(tǒng)資源都相當(dāng)大,甚至可能要比在處理實(shí)際的用戶請(qǐng)求的時(shí)間和資源要多的多。除了創(chuàng)建和銷毀線程的開(kāi)銷之外,活動(dòng)的線程也需要消耗系統(tǒng)資源。如果在一個(gè)jvm里創(chuàng)建太多的線程,可能會(huì)使系統(tǒng)由于過(guò)度消耗內(nèi)存或“切換過(guò)度”而導(dǎo)致系統(tǒng)資源不足。為了防止資源不足,服務(wù)器應(yīng)用程序需要采取一些辦法來(lái)限制任何給定時(shí)刻處理的請(qǐng)求數(shù)目,盡可能減少創(chuàng)建和銷毀線程的次數(shù),特別是一些資源耗費(fèi)比較大的線程的創(chuàng)建和銷毀,盡量利
用已有對(duì)象來(lái)進(jìn)行服務(wù),這就是“池化資源”技術(shù)產(chǎn)生的原因。
線程池主要用來(lái)解決線程生命周期開(kāi)銷問(wèn)題和資源不足問(wèn)題。通過(guò)對(duì)多個(gè)任務(wù)重復(fù)使用線程,線程創(chuàng)建的開(kāi)銷就被分?jǐn)偟搅硕鄠€(gè)任務(wù)上了,而且由于在請(qǐng)求到達(dá)時(shí)線程已經(jīng)存在,所以消除了線程創(chuàng)建所帶來(lái)的延遲。這樣,就可以立即為請(qǐng)求服務(wù),使用應(yīng)用程序響應(yīng)更快。另外,通過(guò)適當(dāng)?shù)恼{(diào)整線程中的線程數(shù)目可以防止出現(xiàn)資源不足的情況。
多線程大大提高程序運(yùn)行效率,我們?cè)陂_(kāi)發(fā)過(guò)程中經(jīng)常會(huì)開(kāi)啟一個(gè)線程來(lái)執(zhí)行一些費(fèi)時(shí)的任務(wù)。開(kāi)啟一個(gè)線程有4種方式,在下面的文章我將詳細(xì)的去講解。
繼承Thread
繼承Thread去執(zhí)行任務(wù),確實(shí)可以開(kāi)啟一個(gè)線程去執(zhí)行任務(wù),如果經(jīng)常的去開(kāi)啟一些線程,也會(huì)導(dǎo)致系統(tǒng)資源的浪費(fèi)。
public static class Mythread extends Thread{ @Override public void run() { System.out.println("當(dāng)前線程"+Thread.currentThread().getId()); int i = 10/2; System.out.println("運(yùn)行結(jié)果"+i); } } //調(diào)用線程。 public static void main(String[] args) throws ExecutionException, InterruptedException { /**thread執(zhí)行方式*/ Mythread mythread = new Mythread(); mythread.start();//啟動(dòng)線程 System.out.println("main--end"); }
實(shí)現(xiàn)Runnale接口
public static class MyRunable implements Runnable { @Override public void run() { System.out.println("當(dāng)前線程"+Thread.currentThread().getId()); int i = 10/2; System.out.println("運(yùn)行結(jié)果"+i); } }
調(diào)用。
/** * runable的啟動(dòng)方式 */ MyRunable runable = new MyRunable(); new Thread(runable).start(); System.out.println("main--end");
Callable
/** * Callable可以允許有返回值 */ public static class Callale01 implements Callable<Integer> { @Override public Integer call() throws Exception { System.out.println("當(dāng)前線程"+Thread.currentThread().getId()); int i = 10/2; System.out.println("運(yùn)行結(jié)果"+i); return i; } }
調(diào)用。這里需要用callable構(gòu)建futureTask
/** * callale的啟動(dòng)方式 */ FutureTask<Integer> futureTask =new FutureTask<>(new Callale01()); //取返回結(jié)果。 Integer i = futureTask.get(); new Thread(futureTask).start(); System.out.println("返回結(jié)果是:"+i);
線程池
線程池才是我們java開(kāi)發(fā)中,經(jīng)常用到一種開(kāi)啟多線程的方式,線程池,自己去管理線程。可以節(jié)省系統(tǒng)資源。通常我們會(huì)將下面的一些配置寫(xiě)在一些配置類中
/** * 七大參數(shù) * corePoolSize: 1.核心線程數(shù)[一直存在]: 線程池創(chuàng)建好了以后。就準(zhǔn)備就緒的線程數(shù)量。 * maxinumPoolSize: 2 最大線程數(shù)量 * keepaliveTime: 存活時(shí)間??臻e線程的最大的等待時(shí)間。 * unit 等待時(shí)間的單位 * blockingQueue 阻塞隊(duì)列。如果任務(wù)很多就會(huì)放在隊(duì)列里面,只要有線程空閑了,就會(huì)去隊(duì)列里面去取。 * threadFactory :線程的工廠。 * RejectExecutionHandler :如果隊(duì)列滿了。按照我們指定的策略。拒絕執(zhí)行任務(wù)。 * */ ThreadPoolExecutor executor = new ThreadPoolExecutor(5,100,10,TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
常見(jiàn)的4種線程池。
1 newCachedThreadPool()
創(chuàng)建一個(gè)可緩存的線程池,如果線程池長(zhǎng)度超過(guò)了處理的需要,可靈活的回收空閑線程。若無(wú)可回收。則創(chuàng)建新線程。
Executors.newCachedThreadPool();
2.newFixedThreadPool(6)
創(chuàng)建一個(gè)固定大小的線程池。
3 newScheduledThreadPool()
定時(shí)任務(wù)的線程池。
4.newSingleThreadExecutor()
Executors.newSingleThreadExecutor();
總結(jié)
到此這篇關(guān)于java中多線程與線程池基本使用的文章就介紹到這了,更多相關(guān)java多線程和線程池使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
RestTemplat中關(guān)于getForobject方法的使用
這篇文章主要介紹了RestTemplat中關(guān)于getForobject方法的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07使用maven對(duì)springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案
springboot項(xiàng)目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個(gè)插件默認(rèn)情況下,會(huì)把所有的依賴包全部壓縮到一個(gè)jar里面,今天給大家分享幾種方案來(lái)如何減小我們的打包文件,需要的朋友可以參考下2024-02-02Mybatis調(diào)用MySQL存儲(chǔ)過(guò)程的簡(jiǎn)單實(shí)現(xiàn)
本篇文章主要介紹了Mybatis調(diào)用MySQL存儲(chǔ)過(guò)程的簡(jiǎn)單實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04Hadoop環(huán)境配置之hive環(huán)境配置詳解
這篇文章主要介紹了Hadoop環(huán)境配置之hive環(huán)境配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12關(guān)于Springboot | @RequestBody 接收到的參數(shù)對(duì)象屬性為空的問(wèn)題
這篇文章主要介紹了關(guān)于Springboot | @RequestBody 接收到的參數(shù)對(duì)象屬性為空的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java Web基于Session的登錄實(shí)現(xiàn)方法
這篇文章主要介紹了Java Web基于Session的登錄實(shí)現(xiàn)方法,涉及Java針對(duì)session的操作及表單提交與驗(yàn)證技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10idea在運(yùn)行期間,實(shí)現(xiàn)讓修改的頁(yè)面實(shí)時(shí)生效
這篇文章主要介紹了idea在運(yùn)行期間,實(shí)現(xiàn)讓修改的頁(yè)面實(shí)時(shí)生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01SpringBoot 如何自定義請(qǐng)求參數(shù)校驗(yàn)
這篇文章主要介紹了SpringBoot 如何自定義請(qǐng)求參數(shù)校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10