線程池,顧名思義,就是可以重複使用的線程的集合。這些線程之前已創建,並且當已經存在可用線程集合時,還可以提供開銷解決方案;這些可以重複使用並解決線程循環和等待線程完成其任務的問題。由於每當請求到達時線程就已經存在,因此它將消除線程創建的過程,從而節省時間並使處理速度更快。在本主題中,我們將學習 Java 線程池。
開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
執行緒池中的所有執行緒都實作 java.util.concurrent 中的方法。有一個執行緒池,由Java執行緒池管理。查看此池的最簡單方法是使用的執行緒越多,每個執行緒執行實際工作所花費的時間就越少。這是一種有助於在可以使用多執行緒的應用程式中節省資源的方法。該 Java 執行緒為池維護一個佇列。
工作執行緒一直等待分配任務並執行它們。 Java中使用ThreadPoolExecutor來建立線程池。可運行執行緒的集合負責管理Java執行緒池中的執行緒。此後,工作執行緒出現並形成隊列。線程池監控這些隊列。
java.util.concurrent.Executors 幫助我們管理線程所需的工廠和支援方法。該類別還負責創建線程池。現在您的下一個問題可能是,這個執行者是什麼? Executor 提供了不同的類別,它們是實用程式類別的一部分。
執行緒池的技術工作可以被認為是一個擁有並發程式碼的池,它被分成可以並行運行的任務。然後它們被提交到池中執行。有任務提交者、執行者服務、任務佇列,最後還有執行緒池。此模式可以幫助您控制應用程式中存在的執行緒數。它決定其生命週期,安排任務,並將傳入的任務保留在工作佇列中。
Executorshelper 類別具有各種具有預先配置執行緒池實例的方法。 Executor 和 ExecutorService 介面有助於處理池中的不同實作。在實際實作之前,程式碼必須是解耦的格式。還有一個使用的介面。它是一個ThreadPoolExecutor。它是一個可擴展的線程池實現,可以指定許多參數,並且可以進行微調。可使用的參數包括核心池大小、最大池大小和保活時間。佇列只能成長到最大池大小。
讓我們建立一個池並看看它是如何運作的。
代碼:
import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; // The Job class will be executed in this case class Job implements Runnable { private String name; public Job(String s) { name = s; } // The task name will be populated first for the ones which were not running already, and the thread will sleep for 2s //This entire method will be repeated 6 times public void run() { try { for (int i = 0; i<=5; i++) { if (i==0) { Date d = new Date(); System.out.println("We are in " + " task name - "+ name); //prints the task name every time the new task is started } else { System.out.println("The job "+ name +" is already running "); // prints the job name which is already running } Thread.sleep(2000); // The thread is in sleep mode for 2 secs } System.out.println(name+" job is completes"); } catch(InterruptedException e) { e.printStackTrace(); } } } public class Test { // Here we define the maximum threads we have static final int MAX_Threads= 5; public static void main(String[] args) { Runnable run1 = new Job("task 1"); Runnable run2 = new Job("task 2"); Runnable run3 = new Job("task 3"); //A new thread pool is created with maximum number of threads ExecutorService newpool = Executors.newFixedThreadPool(MAX_Threads); newpool.execute(run1); newpool.execute(run2); newpool.execute(run3); newpool.shutdown(); } }
上面的程式碼涵蓋了執行緒建立直到關閉的每個步驟。固定和創建的最大線程限制。完成此操作後,將建立三個作業並一一執行。每個作業也分配有 2 秒的睡眠時間。由於線程池已建立並且所有作業同時工作,我們可以看到整個過程將運行 6 次。當 if 語句在執行緒池中執行時,它會檢查作業是否已經在執行。如果作業尚未開始執行,它將執行 if 區塊。如果它已經在運行,那麼 else 區塊將被運行。它將顯示作業名稱並表示它已經在運行。建立執行緒池,然後執行所有 3 個作業。作業運行後,我們關閉已建立的執行緒池。
下面是給定程式的輸出。
輸出:
它會運行直到所有任務完成。
Java 中的執行緒池有幾個優點。僅舉幾例,以下是主要優點:
不過,線程池也有一些缺點。以下是缺點:
因此,線程池是處理我們手頭上的多個任務的有效方法。 Java 為我們提供了重複使用執行緒和利用現有資源的便利性。
以上是Java執行緒池的詳細內容。更多資訊請關注PHP中文網其他相關文章!