1. 程式人生 > >Java多執行緒之執行緒池使用

Java多執行緒之執行緒池使用

本文介紹在Java中如何使用執行緒池。閱讀本文內容,讀者需要對多執行緒及執行緒池的知識有所瞭解,對Java執行緒池的建立及Executors, ExecutorService關鍵類有所接觸。關於這些方面的知識,可以參閱作者的前篇文章。

關鍵類和方法

建立Java執行緒池所需要的兩個基本類:Executors和ExcecutorService類。

Executors類

Executors是一個工廠類,提供了一系列工具方法建立ExecutorService或其子類。

ExecutorService類

ExecutorService執行緒池能夠被關閉,這時它將拒絕新的任務請求。它有兩個方法用於關閉執行緒池。它的shutdown方法允許已經提交的任務在終止前執行,而shutdownNow方法則會阻止等待的任務啟動並且嘗試停止正在執行的任務。一個不再使用的ExecutorService執行緒池應該被關閉以便重新分配它所佔用的資源。

Submit方法

方法submit繼承於方法execute方法,它能夠建立並返回一個Future物件,用於取消執行和(或)等待完成。英文原文:Method submit extends base method Executor.execute(Runnable) bycreating and returning a Future that can be used to cancel execution and/orwait for completion.

使用範例

下面引用官方文件的使用範例。

下面一個網路服務的構架。執行緒池中的執行緒用於處理傳入的請求。它使用預先設定的 工廠方法:

 class NetworkService implements Runnable {
   private final ServerSocket serverSocket;
   private final ExecutorService pool;

   public NetworkService(int port, int poolSize) throws IOException {
     serverSocket = new ServerSocket(port);
     // 建立一個固定執行緒數量的執行緒池處理網路請求
     pool = Executors.newFixedThreadPool(poolSize);
   }

   public void run() { // run the service
     try {
       // 建立一個迴圈處理不斷到來的網路請求
       for (;;) {
         // accept為阻塞方法。每收到一個新的網路請求,則繼續執行
         // 對每個新的網路請求,將其加入執行緒池中等待執行
         pool.execute(new Handler(serverSocket.accept()));
       }
     } catch (IOException ex) {
       pool.shutdown();
     }
   }
 }

// 對網路請求的實際處理
 class Handler implements Runnable {
   private final Socket socket;
   Handler(Socket socket) { this.socket = socket; }
   public void run() {
     // read and service request on socket
   }
 }}

本示例來源於官方文件。感興趣的小夥伴可以下載Oracle的JDK文件深入挖掘。