面试题:线程池参数 工作流程
在Java中,线程池是一种用于管理和复用线程的机制,它可以提高多线程程序的性能和资源利用率。线程池通过维护一定数量的线程,并将任务分配给这些线程来执行,从而避免了频繁创建和销毁线程的开销。本文将介绍线程池的参数和工作流程,并提供具体的Java代码示例。
线程池参数
Java中的线程池有以下几个重要的参数:
- 核心线程数(corePoolSize):线程池中保持的最小线程数量。即使这些线程处于空闲状态,也不会被销毁。默认情况下,核心线程数为0。
- 最大线程数(maximumPoolSize):线程池中允许的最大线程数量。当任务数量超过核心线程数并且任务队列已满时,线程池会创建新的线程,直到达到最大线程数。默认情况下,最大线程数为Integer.MAX_VALUE。
- 空闲线程存活时间(keepAliveTime):当线程池中的线程数量超过核心线程数,并且这些线程处于空闲状态时,超过该时间的线程会被销毁,直到线程池中的线程数量等于核心线程数。默认情况下,空闲线程存活时间为0,即空闲线程会立即被销毁。
- 工作队列(workQueue):用于存放待执行任务的队列。当任务数量超过核心线程数时,任务会被添加到工作队列中等待执行。常用的工作队列有以下几种:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等。
- 线程工厂(threadFactory):用于创建线程的工厂类。可以自定义线程工厂来设置线程的名称、优先级等属性。
- 拒绝策略(rejectedExecutionHandler):当线程池无法处理新的任务时,拒绝策略会决定如何处理这些任务。常用的拒绝策略有以下几种:AbortPolicy(默认策略,抛出RejectedExecutionException异常)、CallerRunsPolicy(使用调用线程来执行任务)、DiscardPolicy(直接丢弃任务)、DiscardOldestPolicy(丢弃最早的任务)。
线程池工作流程
线程池的工作流程如下:
- 当有新的任务提交到线程池时,线程池会判断当前线程数量是否小于核心线程数。如果小于核心线程数,则创建新的线程来执行任务。
- 如果当前线程数量大于等于核心线程数,线程池会将任务添加到工作队列中。
- 当工作队列已满时,线程池会判断当前线程数量是否小于最大线程数。如果小于最大线程数,则创建新的线程来执行任务。
- 如果当前线程数量已达到最大线程数,并且工作队列也已满,线程池会根据设置的拒绝策略来处理新的任务。
- 当线程池中的线程执行完任务后,会继续从工作队列中获取任务并执行。
下面是一个具体的Java代码示例,演示了如何创建和使用线程池:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { // 创建一个固定大小的线程池,核心线程数为2 ExecutorService executor = Executors.newFixedThreadPool(2); // 提交任务到线程池 for (int i = 0; i < 5; i++) { final int task = i; executor.execute(new Runnable() { @Override public void run() { System.out.println("Task " + task + " is running."); } }); } // 关闭线程池 executor.shutdown(); } }
在上面的示例中,我们使用Executors.newFixedThreadPool()方法创建一个固定大小的线程池,核心线程数为2。然后,我们提交了5个任务到线程池中,并使用executor.execute()方法执行任务。最后,我们调用executor.shutdown()方法关闭线程池。
综上所述,线程池是Java中管理和复用线程的机制,可以提高多线程程序的性能和资源利用率。通过设置线程池的参数,我们可以控制线程的数量、存活时间、工作队列等。在实际开发中,合理设置线程池的参数可以提高程序的性能和稳定性。