面试题答案
一键面试1. corePoolSize
- 含义:线程池的核心线程数,即线程池中会一直存活的线程数量,即使这些线程处于空闲状态,也不会被销毁(除非设置了allowCoreThreadTimeOut为true)。
- 作用:它决定了线程池在处理任务时,能同时处理的最少任务数量。当有新任务提交到线程池时,如果当前线程数小于corePoolSize,线程池会创建新的线程来执行任务,而不是将任务放入队列。
- 举例:假设一个Web服务器使用线程池来处理用户请求,corePoolSize设置为10,那么即使在请求量很少的情况下,也会有10个线程随时准备处理新请求,以减少线程创建的开销。
2. maximumPoolSize
- 含义:线程池中允许的最大线程数。当线程池中的任务队列已满,并且当前线程数小于maximumPoolSize时,线程池会继续创建新线程来处理任务。
- 作用:它限制了线程池能够使用的最大资源,防止因为任务过多而导致系统资源耗尽。
- 举例:在一个数据处理系统中,可能会有大量的文件需要处理,如果没有设置合理的maximumPoolSize,可能会因为创建过多线程导致系统内存不足。假设设置maximumPoolSize为100,当任务队列满了且线程数不足100时,会继续创建线程,最多达到100个线程来处理任务。
3. keepAliveTime
- 含义:当线程池中的线程数量超过corePoolSize时,多余的空闲线程在终止前等待新任务的最长时间。
- 作用:通过设置这个时间,可以回收那些长时间闲置的线程,避免线程资源的浪费。
- 举例:如果keepAliveTime设置为5秒,当某个线程从corePoolSize之外创建,并且在5秒内没有新任务分配给它,那么这个线程就会被销毁。比如在一个批处理任务的线程池中,任务处理完后,多余的线程在5秒后就会被清理掉。
4. unit
- 含义:keepAliveTime的时间单位,它可以是TimeUnit类中的各种时间单位,如TimeUnit.SECONDS(秒)、TimeUnit.MILLISECONDS(毫秒)等。
- 作用:明确keepAliveTime参数的时间尺度,确保线程存活时间设置的准确性。
- 举例:若unit设置为TimeUnit.MINUTES,keepAliveTime为2,那么多余线程会在2分钟内没有任务时被销毁。
5. workQueue
- 含义:任务队列,用于存放等待执行的任务。当线程池中的线程数达到corePoolSize后,新提交的任务会被放入这个队列中等待处理。
- 作用:它作为线程池处理任务的缓冲区,减少了频繁创建和销毁线程的开销。不同类型的任务队列(如ArrayBlockingQueue、LinkedBlockingQueue等)会影响线程池的行为。
- 举例:使用ArrayBlockingQueue作为任务队列,它是有界队列,若设置容量为100,当线程数达到corePoolSize后,新任务会进入这个队列,当队列满了且线程数小于maximumPoolSize时,会创建新线程。例如在一个订单处理系统中,订单请求先进入这个队列等待处理。
相互配合影响线程池运行机制举例
假设我们有一个线程池,corePoolSize = 5,maximumPoolSize = 10,keepAliveTime = 10秒,unit = TimeUnit.SECONDS,workQueue = new ArrayBlockingQueue<>(20)。
- 任务提交初期:当开始提交任务时,线程池会创建线程,直到线程数达到corePoolSize(5个线程)。这5个线程会并行处理任务。
- 任务队列填充阶段:如果任务继续提交,且这5个线程都在忙碌,新任务会被放入workQueue(ArrayBlockingQueue,容量为20)。
- 最大线程数扩展阶段:当workQueue满了(有20个任务在队列中等待),如果还有新任务提交,线程池会继续创建线程,直到线程数达到maximumPoolSize(10个线程),此时这10个线程和队列中的20个任务一起处理任务。
- 线程回收阶段:当任务处理完成,线程处于空闲状态,如果线程数超过corePoolSize,这些多余的空闲线程会等待10秒(keepAliveTime),若10秒内没有新任务,就会被销毁,直到线程数回到corePoolSize。