更新時間:2023-04-14 來源:黑馬程序員 瀏覽量:
線程池中的線程是在線程池啟動時就創(chuàng)建好的,而不是在任務到來時才動態(tài)地創(chuàng)建線程。
線程池中的線程創(chuàng)建過程通常包括以下步驟:
1.初始化線程池參數(shù),例如線程池大小、核心線程數(shù)、最大線程數(shù)、等待隊列大小等。
2.創(chuàng)建線程池中的核心線程。核心線程在線程池中始終存在,除非線程池被關閉。
3.創(chuàng)建等待隊列。等待隊列是一個用于存儲任務的緩沖區(qū)域,當線程池中的線程都在忙碌處理任務時,新到來的任務將會被放入等待隊列中等待處理。
4.如果當前任務數(shù)量超過了核心線程數(shù),那么線程池會創(chuàng)建新的線程來處理任務,直到線程數(shù)達到最大線程數(shù)。
5.如果等待隊列已滿,且線程數(shù)已達到最大線程數(shù),那么線程池會根據定義的拒絕策略來拒絕新的任務。
下面是一個簡單的示例代碼,展示了如何在Java中創(chuàng)建一個固定大小的線程池,線程池中的線程在初始化時就會被創(chuàng)建:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { // 創(chuàng)建一個固定大小的線程池,大小為3 ExecutorService executor = Executors.newFixedThreadPool(3); // 提交10個任務給線程池執(zhí)行 for (int i = 1; i <= 10; i++) { executor.execute(new Task(i)); } // 關閉線程池 executor.shutdown(); } static class Task implements Runnable { private int taskId; public Task(int taskId) { this.taskId = taskId; } public void run() { System.out.println("Task #" + taskId + " is being executed by " + Thread.currentThread().getName()); } } }
在上面的示例中,我們創(chuàng)建了一個固定大小的線程池,并提交了10個任務給線程池執(zhí)行。在每個任務執(zhí)行時,都會輸出當前任務的編號以及執(zhí)行任務的線程的名稱??梢钥吹剑總€任務都是由線程池中的一個線程來執(zhí)行的,而不是每次都創(chuàng)建一個新的線程。
總之,線程池中的線程是在啟動時創(chuàng)建好的,并且會一直存在直到線程池被關閉。線程池的好處在于它可以重復使用已有的線程,避免了頻繁地創(chuàng)建和銷毀線程所帶來的開銷和資源浪費。