Java多執行緒之執行緒池使用
阿新 • • 發佈:2018-12-31
本文介紹在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文件深入挖掘。