线程池原理知道吗?以及核心参数

1 个回答

  • 灵溪
    突然就释怀了,我还有万里路要行。
    ### 线程池原理及核心参数 #### 1. 核心参数 - **核心线程数(corePoolSize)**:线程池中始终保持存活的线程数,即使这些线程处于空闲状态。 - **最大线程数(maximumPoolSize)**:线程池中允许创建的最大线程数。当线程数超过核心线程数时,线程池会创建新线程,直到达到最大线程数。 - **活跃时间(keepAliveTime)**:当线程池中的线程数量超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。 - **阻塞队列(workQueue)**:用于存储等待执行的任务。当核心线程都在忙时,新任务会进入该队列。 - **拒绝策略(RejectedExecutionHandler)**:当线程池和阻塞队列都满时,执行的处理策略。 #### 2. 线程池工作流程 1. **提交任务**:当提交一个新任务到线程池时,线程池会根据当前的线程数与核心线程数的对比,决定是否创建新线程。 2. **创建核心线程**:如果当前线程数小于核心线程数(corePoolSize),则创建新线程执行任务。 3. **任务进入队列**:如果当前线程数已达到核心线程数,新的任务将被放入阻塞队列(workQueue)。 4. **创建非核心线程**:如果阻塞队列也满了,并且当前线程数小于最大线程数(maximumPoolSize),则创建新的线程(超过核心线程数的部分)。 5. **销毁空闲线程**:当线程数超过核心线程数,且这些额外线程在等待时间(keepAliveTime)内没有新任务,将被销毁。 6. **拒绝策略**:如果线程数已达到最大线程数,且阻塞队列也满,则根据设置的拒绝策略处理新任务。 #### 3. 示例代码 ```java import java.util.concurrent.*; public class ThreadPoolExample { public static void main(String[] args) { int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 60L; TimeUnit unit = TimeUnit.SECONDS; BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler ); for (int i = 0; i < 20; i++) { executor.execute(() -> { System.out.println(Thread.currentThread().getName() + " is executing task."); try { Thread.sleep(2000); // Simulate work } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); } executor.shutdown(); } } ``` #### 4. 拒绝策略 - **AbortPolicy**:抛出 `RejectedExecutionException` 异常(默认策略)。 - **CallerRunsPolicy**:调用执行当前任务的 `run` 方法运行任务,使用调用者线程来执行任务。 - **DiscardPolicy**:直接丢弃任务,不予处理也不抛出异常。 - **DiscardOldestPolicy**:丢弃阻塞队列中最旧的未处理任务,然后尝试提交新的任务。 ### 总结 线程池通过维护核心线程数、阻塞队列和最大线程数等参数,实现了任务的高效管理和执行。通过合理配置这些参数和拒绝策略,可以有效地控制并发任务的执行和资源使用。
    发布于 2024-07-25 08:17 •IP属地 河南
    举报
    评论
    收藏