詳談Java幾種線程池類型介紹及使用方法。本站提示廣大學習愛好者:(詳談Java幾種線程池類型介紹及使用方法)文章只能為提供參考,不一定能成為您想要的結果。以下是詳談Java幾種線程池類型介紹及使用方法正文
一、線程池使用場景
•單個任務處理時間短
•將需處理的任務數量大
二、使用Java線程池好處
1、使用new Thread()創建線程的弊端:
•每次通過new Thread()創建對象性能不佳。
•線程缺乏統一管理,可能無限制新建線程,相互之間競爭,及可能占用過多系統資源導致死機或oom。
•缺乏更多功能,如定時執行、定期執行、線程中斷。
2、使用Java線程池的好處:
•重用存在的線程,減少對象創建、消亡的開銷,提升性能。
•可有效控制最大並發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。
•提供定時執行、定期執行、單線程、並發數控制等功能。
Java四種線程池
Java裡面線程池的頂級接口是Executor,但是嚴格意義上講Executor並不是一個線程池,而只是一個執行線程的工具。真正的線程池接口是ExecutorService。下面這張圖完整描述了線程池的類體系結構:

1. newCachedThreadPool
創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們。對於執行很多短期異步任務的程序而言,這些線程池通常可提高程序性能。調用 execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。因此,長時間保持空閒的線程池不會使用任何資源。
public static ExecutorService newCachedThreadPool()
示例代碼:
public class ThreadPoolExecutorTest {
public static void main(String[] args ) {
ExecutorService cacheThreadPool =Executors.newCachedThreadPool();
for(int i =1;i<=5;i++){
final int index=i ;
try{
Thread.sleep(1000);
}catch(InterruptedException e ) {
e.printStackTrace();
}
cacheThreadPool.execute(new Runnable(){
@Override
public void run() {
System.out.println("第" +index +"個線程" +Thread.currentThread().getName());
}
});
}
}
}
//輸出結果
第1個線程pool-1-thread-1
第2個線程pool-1-thread-1
第3個線程pool-1-thread-1
第4個線程pool-1-thread-1 第5個線程pool-1-thread-1
由結果可看出 當執行第二個任務時第一個任務已經完成,會復用執行第一個任務的線程,而不用每次新建線程。
2. newFixedThreadPool
創建一個指定工作線程數量的線程池。每當提交一個任務就創建一個工作線程,如果工作線程數量達到線程池初始的最大數,則將提交的任務存入到池隊列中。
public static ExecutorService newFixedThreadPool(int nThreads)
nThreads - 池中的線程數
示例代碼:
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();
}
}
});
}
}
}
由於設置最大線程數為3,所以在輸出三個數後等待2秒後才繼續輸出。
2. newScheduledThreadPool
創建一個線程池,它可安排在給定延遲後運行命令或者定期地執行。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
corePoolSize - 池中所保存的線程數,即使線程是空閒的也包括在內。
延遲執行示例代碼:
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);
}
}
表示延遲3秒執行。
定期執行示例代碼:
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秒後每三秒執行一次");
}
},1,3,TimeUnit.SECONDS);
}
}
表示延遲1秒後每3秒執行一次。
4.newSingleThreadExecutor
創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個線程,那麼如果需要,一個新線程將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的 newFixedThreadPool(1)不同,可保證無需重新配置此方法所返回的執行程序即可使用其他的線程。
public static ExecutorService newSingleThreadExecutor()
示例代碼:
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService singleThreadPool= Executors.newSingleThreadExecutor();
for(int i=1;i<=5;i++){
int index=i;
singleThreadPool.execute(new Runnable(){
@Override
public void run() {
try{
System.out.println("第"+index+"個線程");
Thread.sleep(2000);
}catch(InterruptedException e) {
e.printStackTrace();
}
} });
}
}
}
以上這篇詳談Java幾種線程池類型介紹及使用方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。
[db:作者簡介][db:原文翻譯及解析]