如何使用Java 5 Executor框架创建线程池
Java 5以Executor框架的形式在Java中引入了線程池,它允許Java程序員將任務提交與任務執行分離。 如果要使用Java進行服務器端編程,則線程池是維護系統可伸縮性,魯棒性和穩定性的重要概念。 對于那些不熟悉Java中的線程池或這里的線程池的概念的人來說,Java中的線程池是工作線程的池,可以執行提供給他們的任何任務,主要是通過Runnable的實現形式或Callable接口。 由于Java支持編程語言本身中的多線程,因此它允許多個線程同時運行并執行任務的并行處理。 在本文中,我們將學習有關Java線程池的以下內容:
什么是Java中的線程池以及我們為什么需要它
正如我所說的,線程池是已經創建好的工作線程池,準備好執行此工作。 線程池是任何多線程服務器端Java應用程序都需要的基本功能之一。 使用線程池的一個示例是創建一個處理客戶端請求的Web服務器。 如果您熟悉套接字編程,那么您將知道ServerSocket.accept()正在阻塞方法并一直阻塞 ,直到建立套接字連接為止。 如果僅使用一個線程來處理客戶端請求,則它將隨后限制可以同時訪問服務器的客戶端數量。 為了支持大量客戶端,您可以決定每個請求范例使用一個線程,其中每個請求由單獨的線程處理,但這要求在請求到達時創建線程。 由于創建線程是耗時的過程,因此會延遲請求處理。 它還根據每個JVM允許的線程數限制客戶端的數量,這顯然是有限的。 線程池為您解決了這個問題,它創建了線程并對其進行管理。 線程池不是以創建線程并在完成任務后將其丟棄的方式,而是以工作線程的形式重用線程。 由于通常在應用程序啟動時創建并池化線程,因此您的服務器可以立即開始請求處理,這可以進一步縮短服務器的響應時間。 除此之外,在Java應用程序中使用線程池還有其他好處,我們將在下一部分中看到。 簡而言之,我們需要線程池來更好地管理線程并將任務提交與執行分離。 Java 5中引入的線程池和Executor框架是庫提供的出色線程池。
Java線程池– Java 5中的執行器框架
Java 5引入了一些有用的功能(例如Enum , 泛型 , 變量參數)以及多個并發集合和實用程序(例如ConcurrentHashMap和BlockingQueue等),還引入了完整功能的內置線程池框架(通常稱為Executor框架) 。 該線程池框架的核心是Executor接口,該接口使用方法execute(Runnable task)定義任務執行的抽象; ExecutorService擴展了Executor以添加各種生命周期和線程池管理功能,例如關閉線程池。 Executor框架還提供了一個稱為Executors的靜態實用程序類 (類似于Collections), 該類提供了幾種靜態工廠方法來創建Java中各種類型的線程池實現,例如固定大小的線程池,緩存的線程池和計劃的線程池。
Runnable和Callable接口用于表示由這些線程池中管理的工作線程執行的任務。 Executor框架的有趣之處在于,它基于Producer使用者設計模式 ,其中應用程序線程產生任務和worker線程使用者或執行那些任務,因此,它也遭受了Producer使用者任務的限制,例如生產速度大大高于消耗。當然,僅當您的隊列不受限制時,您才可能因為排隊的任務而運行OutOfMemory。
如何使用Java中的Executor框架創建固定大小的線程池?
由于Executors類提供了靜態工廠方法,因此使用Java 5 Executor框架創建固定大小的線程池非常容易。 您需要做的就是定義要同時執行的任務,然后將該任務提交給ExecutorService。 通過它們,線程池將負責如何執行該任務,它可以由任何空閑的工作線程執行,并且如果您對結果感興趣,則可以查詢Submit()方法返回的Future對象。 Executor框架還提供了不同類型的線程池,例如SingleThreadExecutor僅創建一個工作線程,或者CachedThreadPool在需要時創建工作線程。 您也可以查看Executor框架的Java文檔以獲取此API提供的服務的完整詳細信息。 實踐中的Java并發性還有兩章專門介紹Java 5 Executor框架的有效使用,這對任何高級Java開發人員都值得一讀。
Java中的線程池示例
這是Java中的線程池的示例,該示例使用Java 5的Executor框架創建工作線程數為10的固定線程池。它將創建任務并將其提交到線程池以執行:
public class ThreadPoolExample {public static void main(String args[]) {ExecutorService service = Executors.newFixedThreadPool(10);for (int i =0; i<100; i++){service.submit(new Task(i));}}}final class Task implements Runnable{private int taskId;public Task(int id){this.taskId = id;}@Overridepublic void run() {System.out.println("Task ID : " + this.taskId +" performed by " + Thread.currentThread().getName());}}Output: Task ID : 0 performed by pool-1-thread-1 Task ID : 3 performed by pool-1-thread-4 Task ID : 2 performed by pool-1-thread-3 Task ID : 1 performed by pool-1-thread-2 Task ID : 5 performed by pool-1-thread-6 Task ID : 4 performed by pool-1-thread-5如果查看此Java示例的輸出,則會發現線程池中正在執行任務的線程不同。
Java線程池的好處
線程池為Java應用程序提供了幾項好處,其中最大的好處是將任務提交與任務執行分離開來,如果緊密耦合的創建和執行模式比緊密耦合的創建和執行模式更為松散,則可以實現。 這是在Java中使用線程池的更多好處:
以上就是Java 5中的線程池。我們已經了解了Java中的線程池,Java 5中的執行者框架,如何在Java中創建線程池以及在Java應用程序中使用線程池的一些好處。 毫無疑問,線程池的知識對于服務器端核心Java開發人員至關重要,我建議閱讀Java中的Java線程和并發實踐以了解有關并發和線程池的更多信息。
本文推薦書籍
- Brian Goeatz,Doug Leaa,Joshua Bloch和團隊的實踐中的Java并發
- Java線程,作者:Scott Oaks和Henry Wong
- Joshua Bloach撰寫的有效Java
翻譯自: https://www.javacodegeeks.com/2013/07/how-to-create-thread-pools-using-java-5-executor-framework.html
總結
以上是生活随笔為你收集整理的如何使用Java 5 Executor框架创建线程池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器恢复出厂设置怎么上网恢复出厂设置路
- 下一篇: 怎么查看电脑使用次数与时间如何查看电脑的