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

