溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中的線程池類型有哪些

發(fā)布時(shí)間:2020-11-11 16:42:25 來(lái)源:億速云 閱讀:161 作者:Leah 欄目:編程語(yǔ)言

本篇文章為大家展示了Java中的線程池類型有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

一、線程池使用場(chǎng)景

單個(gè)任務(wù)處理時(shí)間短

將需處理的任務(wù)數(shù)量大

二、使用Java線程池好處

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

•每次通過new Thread()創(chuàng)建對(duì)象性能不佳。

•線程缺乏統(tǒng)一管理,可能無(wú)限制新建線程,相互之間競(jìng)爭(zhēng),及可能占用過多系統(tǒng)資源導(dǎo)致死機(jī)或oom。

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

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

•重用存在的線程,減少對(duì)象創(chuàng)建、消亡的開銷,提升性能。

•可有效控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率,同時(shí)避免過多資源競(jìng)爭(zhēng),避免堵塞。

•提供定時(shí)執(zhí)行、定期執(zhí)行、單線程、并發(fā)數(shù)控制等功能。

Java四種線程池

Java里面線程池的頂級(jí)接口是Executor,但是嚴(yán)格意義上講Executor并不是一個(gè)線程池,而只是一個(gè)執(zhí)行線程的工具。真正的線程池接口是ExecutorService。下面這張圖完整描述了線程池的類體系結(jié)構(gòu):

Java中的線程池類型有哪些

1. newCachedThreadPool

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

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 +"個(gè)線程" +Thread.currentThread().getName());  
        }  
      });
    }
  }
}


//輸出結(jié)果
第1個(gè)線程pool-1-thread-1
第2個(gè)線程pool-1-thread-1
第3個(gè)線程pool-1-thread-1
第4個(gè)線程pool-1-thread-1 第5個(gè)線程pool-1-thread-1  

由結(jié)果可看出 當(dāng)執(zhí)行第二個(gè)任務(wù)時(shí)第一個(gè)任務(wù)已經(jīng)完成,會(huì)復(fù)用執(zhí)行第一個(gè)任務(wù)的線程,而不用每次新建線程。

2. newFixedThreadPool

創(chuàng)建一個(gè)指定工作線程數(shù)量的線程池。每當(dāng)提交一個(gè)任務(wù)就創(chuàng)建一個(gè)工作線程,如果工作線程數(shù)量達(dá)到線程池初始的最大數(shù),則將提交的任務(wù)存入到池隊(duì)列中。

public static ExecutorService newFixedThreadPool(int nThreads)

nThreads - 池中的線程數(shù)

示例代碼:

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 + "個(gè)線程" +Thread.currentThread().getName());
            Thread.sleep(1000);
          } catch(InterruptedException e ) {
             e .printStackTrace();
          }
        }

      });
    }
  }
}

由于設(shè)置最大線程數(shù)為3,所以在輸出三個(gè)數(shù)后等待2秒后才繼續(xù)輸出。

2. newScheduledThreadPool

創(chuàng)建一個(gè)線程池,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

corePoolSize - 池中所保存的線程數(shù),即使線程是空閑的也包括在內(nèi)。

延遲執(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);
  }
}

表示延遲3秒執(zhí)行。

定期執(zhí)行示例代碼:

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);
 }

}

表示延遲1秒后每3秒執(zhí)行一次。

4.newSingleThreadExecutor

創(chuàng)建一個(gè)使用單個(gè) worker 線程的 Executor,以無(wú)界隊(duì)列方式來(lái)運(yùn)行該線程。(注意,如果因?yàn)樵陉P(guān)閉前的執(zhí)行期間出現(xiàn)失敗而終止了此單個(gè)線程,那么如果需要,一個(gè)新線程將代替它執(zhí)行后續(xù)的任務(wù))??杀WC順序地執(zhí)行各個(gè)任務(wù),并且在任意給定的時(shí)間不會(huì)有多個(gè)線程是活動(dòng)的。與其他等效的 newFixedThreadPool(1)不同,可保證無(wú)需重新配置此方法所返回的執(zhí)行程序即可使用其他的線程。

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+"個(gè)線程");
        Thread.sleep(2000);
         }catch(InterruptedException e) {            
          e.printStackTrace();
        }
      } });
    }
  }
}

上述內(nèi)容就是Java中的線程池類型有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI