Java線程池的種類

Java線程池的使用

顧名思義,池子裏面有多個線程,但是會有不同的池子,那麼就簡單的介紹下池子的種類

線程池的種類

Java通過Executors提供四種線程池。分別爲:

Executors.newCachedThreadPool()

創建一個可緩存線程的線程池,可靈活創建、回收線程。

Executors.newFixedThreadPool(int num)

創建一個定長線程的線程池,可以控制最大併發數。

Executors.newScheduledThreadPool(int num)

創建一個定長線程的線程池,支持自定義線程定時執行任務。

Execuotrs.newSingleThreadExecutor()

創建一個只有一個線程的線程池。

示例代碼

Executors.newCachedThreadPool()

可緩存線程的線程池,可靈活創建、回收線程

  1. public class ThreadPoolExecutorTest {  
  2.  public static void main(String[] args) { 
  3. // 該線程池中的線程數量理論爲無限大 
  4.   ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
  5.   for (int i = 0; i < 10; i++) {  
  6.    final int index = i;  
  7.    try {  
  8.     Thread.sleep(index * 1000);  
  9.    } catch (InterruptedException e) {  
  10.     e.printStackTrace();  
  11.    }
  12. // 當執行第二個任務時,第一個任務已經執行完成,所以第二個任務會複用第一個線程。而不用創建新的線程
  13.    cachedThreadPool.execute(new Runnable() {  
  14.     public void run() {  
  15.      System.out.println(index);  
  16.     }  
  17.    });  
  18.   }  
  19.  }  
  20. }  

Executors.newFixedThreadPool(int num)

定長線程的線程池,可以控制最大併發數,超出的線程會在隊列中等待

  1. public class ThreadPoolExecutorTest {  
  2.  public static void main(String[] args) {  
  3.   ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  
  4.   for (int i = 0; i < 10; i++) {  
  5.    final int index = i;  
  6.    fixedThreadPool.execute(new Runnable() {
  7. // 線程池中的線程數量爲3個,所以每兩秒打印三個數字
  8.     public void run() {  
  9.      try {  
  10.       System.out.println(index);  
  11.       Thread.sleep(2000);  
  12.      } catch (InterruptedException e) {  
  13.       e.printStackTrace();  
  14.      }  
  15.     }  
  16.    });  
  17.   }  
  18.  }  
  19. }

Executors.newScheduledThreadPool(int num)

創建一個定長線程的線程池,支持自定義線程延遲執行任務、週期執行任務

  1. public class ThreadPoolExecutorTest {  
  2.  public static void main(String[] args) {  
  3.   ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  
  4.   scheduledThreadPool.schedule(new Runnable() {
  5.    public void run() {  
  6.     System.out.println("delay 3 seconds");  
  7.    }  
  8. // 表示每個線程延遲三秒執行
  9.   }, 3, TimeUnit.SECONDS);  
  10. // 表示每個線程延遲一秒,每三秒執行一次
  11. //}, 1, 3, TimeUnit.SECONDS);
  12.  }  
  13. }  

Execuotrs.newSingleThreadExecutor()

創建一個只有一個線程的線程池

  1. public class ThreadPoolExecutorTest {  
  2.  public static void main(String[] args) {  
  3.   ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  
  4.   for (int i = 0; i < 10; i++) {  
  5.    final int index = i;  
  6.    singleThreadExecutor.execute(new Runnable() {  
  7.     public void run() {  
  8.      try {  
  9.       System.out.println(index);  
  10.       Thread.sleep(2000);  
  11.      } catch (InterruptedException e) {  
  12.       e.printStackTrace();  
  13.      }  
  14.     }  
  15.    });  
  16.   }  
  17.  }  
  18. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章