Java中四種線程池的使用示例詳解
在什么情況下使用線程池?
1.單個任務處理的時間比較短
2.將需處理的任務的數(shù)量大
使用線程池的好處:
1.減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷
2.如不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量線程而導致消耗完系統(tǒng)內存以及”過度切換”。
本文詳細的給大家介紹了關于Java中四種線程池的使用,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:
FixedThreadPool
由Executors的newFixedThreadPool方法創(chuàng)建。它是一種線程數(shù)量固定的線程池,當線程處于空閑狀態(tài)時,他們并不會被回收,除非線程池被關閉。當所有的線程都處于活動狀態(tài)時,新的任務都會處于等待狀態(tài),直到有線程空閑出來。FixedThreadPool只有核心線程,且該核心線程都不會被回收,這意味著它可以更快地響應外界的請求。
FixedThreadPool沒有額外線程,只存在核心線程,而且核心線程沒有超時機制,而且任務隊列沒有長度的限制。
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService fixedThreadPool =Executors. newFixedThreadPool(3);
for (int i =1; i<=5;i++){
final int index=i ;
fixedThreadPool.execute(new Runnable(){
@Override
public void run() {
try {
System.out.println("第" +index + "個線程" +Thread.currentThread().getName());
Thread.sleep(1000);
} catch(InterruptedException e ) {
e .printStackTrace();
}
}
});
}
}
}
CachedThreadPool
由Executors的newCachedThreadPool方法創(chuàng)建,不存在核心線程,只存在數(shù)量不定的非核心線程,而且其數(shù)量最大值為Integer.MAX_VALUE。當線程池中的線程都處于活動時(全滿),線程池會創(chuàng)建新的線程來處理新的任務,否則就會利用新的線程來處理新的任務,線程池中的空閑線程都有超時機制,默認超時時長為60s,超過60s的空閑線程就會被回收。和FixedThreadPool不同的是,CachedThreadPool的任務隊列其實相當于一個空的集合,這將導致任何任務都會被執(zhí)行,因為在這種場景下SynchronousQueue是不能插入任務的,SynchronousQueue是一個特殊的隊列,在很多情況下可以理解為一個無法儲存元素的隊列。從CachedThreadPool的特性看,這類線程比較適合執(zhí)行大量耗時較小的任務。當整個線程池都處于閑置狀態(tài)時,線程池中的線程都會因為超時而被停止回收,幾乎是不占任何系統(tǒng)資源。
ScheduledThreadPool
通過Executors的newScheduledThreadPool方式創(chuàng)建,核心線程數(shù)量是固定的,而非核心線程是沒有限制的,并且當非核心線程閑置時它會被立即回收,ScheduledThreadPool這類線程池主要用于執(zhí)行定時任務和具有固定時期的重復任務。
延遲:
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);
scheduledThreadPool.schedule(newRunnable(){
@Override
public void run() {
System.out.println("延遲三秒");
}
}, 3, TimeUnit.SECONDS);
}
}
定時:
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);
scheduledThreadPool.scheduleAtFixedRate(newRunnable(){
@Override
public void run() {
System.out.println("延遲1秒后每三秒執(zhí)行一次");
}
},1,3,TimeUnit.SECONDS);
}
}
SingleThreadExecutor
通過Executors的newSingleThreadExecutor方法來創(chuàng)建。這類線程池內部只有一個核心線程,它確保所有的任務都在同一個線程中按順序執(zhí)行。SingleThreadExecutor的意義在于統(tǒng)一所有外界任務一個線程中,這使得這些任務之間不需要處理線程同步的問題
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
java根據(jù)模板實現(xiàn)填充word內容并轉換為pdf
這篇文章主要為大家詳細介紹了java如何根據(jù)模板實現(xiàn)填充word內容并轉換為pdf,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-04-04
在Struts2中如何將父類屬性序列化為JSON格式的解決方法
本篇文章,小編將為大家介紹關于在Struts2中如何將父類屬性序列化為JSON格式的解決方法,有需要的朋友可以參考一下2013-04-04
剖析Java中HashMap數(shù)據(jù)結構的源碼及其性能優(yōu)化
這篇文章主要介紹了Java中HashMap數(shù)據(jù)結構的源碼及其性能優(yōu)化,文中以Java 8后HashMap的性能提升來討論了HashMap的一些優(yōu)化點,需要的朋友可以參考下2016-05-05
Java基于阻塞隊列實現(xiàn)生產者消費者模型示例詳解
這篇文章主要介紹了Java基于阻塞隊列實現(xiàn)生產者消費者模型,阻塞隊列的特點就是阻塞兩個字,阻塞功能使得生產者和消費者兩端的能力得以平衡,當有任何一端速度過快時,阻塞隊列便會把過快的速度降下來,感興趣的朋友可以參考下2023-12-12
Spring?Boot中的@EnableAutoConfiguration注解詳解
這篇文章主要介紹了Spring?Boot中的@EnableAutoConfiguration注解詳解,Spring?Boot是一個非常流行的Java框架,它可以快速創(chuàng)建基于Spring的應用程序。Spring?Boot提供了許多自動配置功能,使得開發(fā)者可以非常容易地創(chuàng)建一個可運行的應用程序,需要的朋友可以參考下2023-08-08
SpringBoot 使用Prometheus采集自定義指標數(shù)據(jù)的方案
這篇文章主要介紹了SpringBoot 使用Prometheus采集自定義指標數(shù)據(jù),我們在k8s集群成功搭建了Prometheus服務,今天,我們將在springboot2.x中使用prometheus記錄指標,需要的朋友可以參考下2022-10-10
springBoot靜態(tài)資源加載不到,并且配置了也不生效問題及解決
這篇文章總結了一個在Spring Boot 2.6.x版本中,由于路徑匹配策略改變導致靜態(tài)資源無法加載的問題,并提供了解決方案:通過配置類或在配置文件中設置路徑匹配策略為AntPathMatcher,或者直接降級Spring Boot版本2025-02-02

