一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳談Java幾種線程池類型介紹及使用方法

詳談Java幾種線程池類型介紹及使用方法

2020-08-26 10:25Java之家 Java教程

下面小編就為大家帶來一篇詳談Java幾種線程池類型介紹及使用方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、線程池使用場景

•單個任務處理時間短

•將需處理的任務數量大

二、使用Java線程池好處

1、使用new Thread()創建線程的弊端:

•每次通過new Thread()創建對象性能不佳。

•線程缺乏統一管理,可能無限制新建線程,相互之間競爭,及可能占用過多系統資源導致死機或oom。

•缺乏更多功能,如定時執行、定期執行、線程中斷。

2、使用Java線程池的好處:

•重用存在的線程,減少對象創建、消亡的開銷,提升性能。

•可有效控制最大并發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。

•提供定時執行、定期執行、單線程、并發數控制等功能。

Java四種線程池

Java里面線程池的頂級接口是Executor,但是嚴格意義上講Executor并不是一個線程池,而只是一個執行線程的工具。真正的線程池接口是ExecutorService。下面這張圖完整描述了線程池的類體系結構:

詳談Java幾種線程池類型介紹及使用方法

1. newCachedThreadPool

創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們。對于執行很多短期異步任務的程序而言,這些線程池通常可提高程序性能。調用 execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。因此,長時間保持空閑的線程池不會使用任何資源。

public static ExecutorService newCachedThreadPool()

示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 - 池中的線程數

示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 - 池中所保存的線程數,即使線程是空閑的也包括在內。

延遲執行示例代碼:

 

?
1
2
3
4
5
6
7
8
9
10
11
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秒執行。

定期執行示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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()

示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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幾種線程池類型介紹及使用方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: h玉足嫩脚嗯啊白丝 | 2018高清国产一道国产 | 国产精品视频免费观看 | 99r视频在线观看 | 四虎影视永久免费视频观看 | 羞羞麻豆国产精品1区2区3区 | 无限资源在线观看完整版免费下载 | 日韩a级片视频 | 国产精品免费视频能看 | chinese特色video | 34看网片午夜理 | chanelpreston欧美网站 | 国产成人a∨麻豆精品 | 91久久碰国产 | 国产欧美精品 | 精品精品国产自在现拍 | 国产日本久久久久久久久婷婷 | 天天做天天爱天天综合网 | 天天色天 | ai换脸造梦jennie | 2022国产在线观看 | 爸爸的宝贝小说全文在线阅读 | 青青青视频免费线看 视频 青青青青青国产免费手机看视频 | 精品蜜臀AV在线天堂 | 国产综合成色在线视频 | 免费理伦片在线观看全网站 | 欧美一级久久久久久久大片 | 国语自产自拍秒拍在线视频 | 四虎网站最新网址 | 免费一级欧美大片在线观看 | t66y地址一地址二地址三 | 九九精品免视看国产成人 | 99视频九九精品视频在线观看 | 久久亚洲免费视频 | 欧美肥胖bb| 国产精品一区二区久久不卡 | 福利一区三区 | 日韩免费视频播播 | 韩国美女被的免费视频 | 成人免费视频在 | 国语刺激对白勾搭视频在线观看 |