更新时间: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个任务给线程池执行。在每个任务执行时,都会输出当前任务的编号以及执行任务的线程的名称。可以看到,每个任务都是由线程池中的一个线程来执行的,而不是每次都创建一个新的线程。
总之,线程池中的线程是在启动时创建好的,并且会一直存在直到线程池被关闭。线程池的好处在于它可以重复使用已有的线程,避免了频繁地创建和销毁线程所带来的开销和资源浪费。