歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java 線程池 ExecutorService

在應用程序中中需要頻繁的創建許多生命周期很短的線程,用傳統方法的話就會造成大量的資源了浪費,且不可復用和控制回收,就像直接使用jdbc數據連接,而不使用數據庫連接池來管理數據庫連接一樣。

 java在jdk1.5 版本中加入了線程池特性,它負責管理大量的線程的創建銷毀等操作。

相關類:java.util.concurrent.Executors(執行器),執行器類擁有大量的靜態工廠方法用於創建線程池。

1、線程池實現類:

 newCachedThreadPool:通過名稱,不難看出這個方法創建出的線程池,具有數量可變,並且在需要的時候會自動創建更多的線程,並且會自動銷毀線程。

 newFixedThreadPool:此線程池與newCachedThreadPool構建出的線程池的主要區別是,線程池在數量上固定,如果任務數量達到上限的話,就會將多余任務加入任務隊列,等線程池空出線程時即可執行,這種線程池並不會銷毀空閒線程。 

 newSingleThreadExecutor:此方法創建出的線程池相較於其他兩個線程較為特殊,此方法創建出的線程數量僅僅為1,也就是說所有除了正在執行的任務外,其余任務均在任務隊列中,當線程中的任務執行完畢後,任務隊列的第一個任務進入線程開始執行。

 newScheduledThreadPool與newSingleThreadScheduledExecutor:這兩個方法創建出的線程池是用於預定執行的線程池,他們可以用於在初始化後延遲執行,或周期性的執行,兩種線程池大體相同,唯一的區別就是可同時執行的線程數量。

2、線程池使用步驟:

(1)調用執行器類(Executors)的靜態方法來創建線程池

(2)調用線程池的submit方法提交Runnable或Callable對象

(3)調用shutdown關閉入口,讓線程池不能再提交任務,之前的任務仍會執行完成

3、代碼操作示例:

//創建線程池對象
ExecutorService service = Executors.newCachedThreadPool();
//創建一個用於遞增輸出i值的runnable對象
Runnable runnable = new Runnable() {
 @Override
 public void run() {
  for (int i = 0; i < 1000; i++) {
   System.out.println(i);
  }
 }
};
//調用線程池的submit方法傳入runnable(傳入的runnable將會自動執行)
service.submit(runnable);
//調用shutdown方法關閉入口
service.shutdown();

// 用來關閉線程池入口以及終止所有正在執行的任務
service.shutdownNow();

PS: 如果希望直接停止線程池的一切任務是無法通過shutdown來操作的,因為shutdown僅僅是關閉了入口,但是已經加入的任務還是會繼續執行的,這時我們可以調用線程池的shutdownNow方法來操作,shutdownNow的作用是用來關閉線程池的入口並且會嘗試終止所有當前線程池內的任務。

4、獲取線程執行結果或查看線程狀態:

service的submit方法會返回一個Future<?>類型的對象,該對象用於在加入線程池以後能夠對此任務進行取消,查看狀態等操作,如果說在加入線程池以後有可能會取消此任務的話就需要,在submit的時候就需要保存好Future對象。

//保存Future<?>
Future<?> run2 = service.submit(runnable);

//用於查看是否已經執行完畢,返回類型為boolean
System.out.println(run2.isDone());

//取消任務,如果需要中斷的話參數為true
run2.cancel(true);

Copyright © Linux教程網 All Rights Reserved