乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java:Java程序猿必會的四種線程池

       好程序員IT 2019-07-10

      前言,對于Java程序猿來說,線程池是面試高頻題,是我們必須掌握的一個技能,本篇文章主要給大家講解四種線程池的使用。

      線程池簡介

       線程池的概念:

      線程池就是首先創(chuàng)建一些線程,它們的集合稱為線程池。使用線程池可以很好地提高性能,線程池在系統(tǒng)啟動時即創(chuàng)建大量空閑的線程,程序將一個任務傳給線程池,線程池就會啟動一條線程來執(zhí)行這個任務,執(zhí)行結束以后,該線程并不會死亡,而是再次返回線程池中成為空閑狀態(tài),等待執(zhí)行下一個任務。

      線程池的工作機制:

               在線程池的編程模式下,任務是提交給整個線程池,而不是直接提交給某個線程,線程池在拿到任務后,就在內部尋找是否有空閑的線程,如果有,則將任務交給某個空閑的線程。

               一個線程同時只能執(zhí)行一個任務,但可以同時向一個線程池提交多個任務。

      使用線程池的原因:

              多線程運行時間,系統(tǒng)不斷的啟動和關閉新線程,成本非常高,會過渡消耗系統(tǒng)資源,以及過渡切換線程的危險,從而可能導致系統(tǒng)資源的崩潰。這時,線程池就是最好的選擇了。

      四種常見的線程池詳解

      4.1 Executors.newCacheThreadPool()

      Executors.newCacheThreadPool():可緩存線程池,先查看池中有沒有以前建立的線程,如果有,就直接使用。如果沒有,就建一個新的線程加入池中,緩存型池子通常用于執(zhí)行一些生存期很短的異步型任務

      代碼:

      1. import java.util.concurrent.ExecutorService;  

      2.   import java.util.concurrent.Executors;  

      3.     

      4.   public class ThreadPoolExecutorTest {  

      5.       public static void main(String[] args) {  

      6.           //創(chuàng)建一個可緩存線程池  

      7.           ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  

      8.          for (int i = 0; i < 10; i++) {  

      9.              try {  

      10.                  //sleep可明顯看到使用的是線程池里面以前的線程,沒有創(chuàng)建新的線程  

      11.                  Thread.sleep(1000);  

      12.            } catch (InterruptedException e) {  

      13.                  e.printStackTrace();  

      14.              }  

      15.              cachedThreadPool.execute(new Runnable() {  

      16.                  public void run() {  

      17.                      //打印正在執(zhí)行的緩存線程信息  

      18.                      System.out.println(Thread.currentThread().getName()+"正在被執(zhí)行");  

      19.                  }  

      20.              });  

      21.          }  

      22.      }  

      23.  }  

      線程池為無限大,當執(zhí)行當前任務時上一個任務已經(jīng)完成,會復用執(zhí)行上一個任務的線程,而不用每次新建線程

      4.2 Executors.newFixedThreadPool(int n)

      Executors.newFixedThreadPool(int n):創(chuàng)建一個可重用固定個數(shù)的線程池,以共享的無界隊列方式來運行這些線程。

      代碼:

      1. package com.study.test;  

      2.     

      3.   import java.util.concurrent.ExecutorService;  

      4.   import java.util.concurrent.Executors;  

      5.     

      6.   public class ThreadPoolExecutorTest {  

      7.      public static void main(String[] args) {  

      8.          //創(chuàng)建一個可重用固定個數(shù)的線程池  

      9.           ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  

      10.          for (int i = 0; i < 10; i++) {  

      11.              fixedThreadPool.execute(new Runnable() {  

      12.                  public void run() {  

      13.                      try {  

      14.                          //打印正在執(zhí)行的緩存線程信息  

      15.                          System.out.println(Thread.currentThread().getName()+"正在被執(zhí)行");  

      16.                          Thread.sleep(2000);  

      17.                      } catch (InterruptedException e) {  

      18.                          e.printStackTrace();  

      19.                      }  

      20.                  }  

      21.              });  

      22.          }  

      23.      }  

      24.  }  

      25.  }  

      4.3 Executors.newScheduledThreadPool(int n)

       Executors.newScheduledThreadPool(int n):創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行

      代碼:

      1. package com.study.test;  

      2.   

      3. import java.util.concurrent.Executors;  

      4. import java.util.concurrent.ScheduledExecutorService;  

      5. import java.util.concurrent.TimeUnit;  

      6.   

      7. public class ThreadPoolExecutorTest {  

      8.     public static void main(String[] args) {  

      9.         //創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行——延遲執(zhí)行  

      10.         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  

      11.         //延遲1秒執(zhí)行  

      12.         scheduledThreadPool.schedule(new Runnable() {  

      13.             public void run() {  

      14.                 System.out.println("延遲1秒執(zhí)行");  

      15.             }  

      16.         }, 1, TimeUnit.SECONDS);  

      17.     }  

      18. }  

      輸出結果:延遲1秒執(zhí)行

      代碼2:可以定時執(zhí)行

      1.  package com.study.test;  

      2.   

      3. import java.util.concurrent.Executors;  

      4. import java.util.concurrent.ScheduledExecutorService;  

      5. import java.util.concurrent.TimeUnit;  

      6.   

      7. public class ThreadPoolExecutorTest {  

      8.     public static void main(String[] args) {  

      9.         //創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行——定期執(zhí)行  

      10.         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  

      11.         //延遲1秒后每3秒執(zhí)行一次  

      12.         scheduledThreadPool.scheduleAtFixedRate(new Runnable() {  

      13.             public void run() {  

      14.                 System.out.println("延遲1秒后每3秒執(zhí)行一次");  

      15.             }  

      16.         }, 13, TimeUnit.SECONDS);  

      17.     }  

      18. }  

      4.4 Executors.newSingleThreadExecutor()

       Executors.newSingleThreadExecutor():創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務,保證所有任務按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。

      1. package com.study.test;  

      2.    

      3.  import java.util.concurrent.ExecutorService;  

      4.  import java.util.concurrent.Executors;  

      5.    

      6.  public class TestThreadPoolExecutor {  

      7.      public static void main(String[] args) {  

      8.          ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  

      9.          for (int i = 0; i < 10; i++) {  

      10.              final int index = i;  

      11.              singleThreadExecutor.execute(new Runnable() {  

      12.                  public void run() {  

      13.                      try {  

      14.                          //結果依次輸出,相當于順序執(zhí)行各個任務  

      15.                          System.out.println(Thread.currentThread().getName()+"正在被執(zhí)行,打印的值是:"+index);  

      16.                          Thread.sleep(1000);  

      17.                      } catch (InterruptedException e) {  

      18.                          e.printStackTrace();  

      19.                      }  

      20.                  }  

      21.              });  

      22.          }  

      23.      }  

      24.  }  

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多