更新时间:2023-04-14 来源:黑马程序员 浏览量:
线程池中的线程是在线程池启动时就创建好的,而不是在任务到来时才动态地创建线程。
线程池中的线程创建过程通常包括以下步骤:
1.初始化线程池参数,例如线程池大小、核心线程数、最大线程数、等待队列大小等。
2.创建线程池中的核心线程。核心线程在线程池中始终存在,除非线程池被关闭。
3.创建等待队列。等待队列是一个用于存储任务的缓冲区域,当线程池中的线程都在忙碌处理任务时,新到来的任务将会被放入等待队列中等待处理。
4.如果当前任务数量超过了核心线程数,那么线程池会创建新的线程来处理任务,直到线程数达到最大线程数。
5.如果等待队列已满,且线程数已达到最大线程数,那么线程池会根据定义的拒绝策略来拒绝新的任务。
下面是一个简单的示例代码,展示了如何在Java中创建一个固定大小的线程池,线程池中的线程在初始化时就会被创建:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { // 创建一个固定大小的线程池,大小为3 ExecutorService executor = Executors.newFixedThreadPool(3); // 提交10个任务给线程池执行 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()); } } }
在上面的示例中,我们创建了一个固定大小的线程池,并提交了10个任务给线程池执行。在每个任务执行时,都会输出当前任务的编号以及执行任务的线程的名称。可以看到,每个任务都是由线程池中的一个线程来执行的,而不是每次都创建一个新的线程。
总之,线程池中的线程是在启动时创建好的,并且会一直存在直到线程池被关闭。线程池的好处在于它可以重复使用已有的线程,避免了频繁地创建和销毁线程所带来的开销和资源浪费。