线程池面试题怎么答?搞定这8个核心问题轻松通过面试
1. 为什么要使用线程池?
使用线程池可以提高程序的性能和响应速度,避免频繁地创建和销毁线程,减少系统开销。线程池可以复用线程,减少线程的上下文切换,提高CPU的利用率。线程池还可以限制并发线程的数量,防止系统资源被耗尽。
2. 线程池中的参数有哪些?
线程池中的参数主要有核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、线程空闲时间(keepAliveTime)和队列容量(workQueue)。核心线程数是指线程池启动后保持的最小线程数,即使线程空闲也不会被销毁;最大线程数是指线程池能够创建的最大线程数;线程空闲时间是指线程空闲多长时间后会被销毁;队列容量是指线程池中的任务队列能够容纳的最大任务数。
3. 线程池中的任务队列有哪些类型?
线程池中的任务队列主要有三种类型:直接提交队列(SynchronousQueue)、有界任务队列(ArrayBlockingQueue)和任务队列(LinkedBlockingQueue)。直接提交队列将任务直接提交给线程,不保存任务,适用于核心线程数等于最大线程数的情况;有界任务队列保存固定数量的任务,当任务数达到上限时,会按照特定的策略处理新任务,如拒绝策略或阻塞等待;任务队列可以保存任意数量的任务,但需要注意防止内存溢出。
4. 线程池中的拒绝策略有哪些?
线程池中的拒绝策略主要有四种:AbortPolicy(抛出异常)、CallerRunsPolicy(让调用者线程运行任务)、DiscardPolicy(丢弃最老的任务)和DiscardOldestPolicy(丢弃最旧的任务)。这些策略在任务数超过队列容量和最大线程数时会被触发,以处理新任务。
5. 线程池的工作原理是什么?
线程池的工作原理是:当提交任务时,线程池会先检查核心线程数是否已满,如果未满,就创建新的线程执行任务;如果已满,就将任务放入任务队列中,等待线程池中的线程来取任务执行;如果任务队列已满,就根据拒绝策略来处理新任务。当线程空闲时,如果当前线程数大于核心线程数,就销毁多余的线程,直到线程数等于核心线程数。
6. 如何配置线程池参数?
配置线程池参数需要根据具体的应用场景和需求来确定。核心线程数应该设置为系统可用CPU核数的整数倍,最大线程数可以根据任务量和系统资源情况来设置,线程空闲时间可以根据任务的特点来设置,队列容量可以根据任务量来设置。需要根据任务的特性选择合适的任务队列和拒绝策略。
7. 线程池的使用注意事项有哪些?
使用线程池需要注意以下几点:需要确保线程池中的线程能够正确关闭,避免资源泄漏;需要避免线程池中的线程数过多,导致系统资源被耗尽;需要根据任务的特性选择合适的任务队列和拒绝策略,以处理任务队列已满和线程数已满的情况。
8. 线程池和线程的区别是什么?
线程池和线程的区别在于:线程池可以复用线程,减少线程的创建和销毁开销,提高CPU的利用率;而线程是独立的执行单元,每个线程都有自己的栈和程序计数器,可以独立执行任务。线程池可以限制并发线程的数量,防止系统资源被耗尽,而线程的数量则取决于系统的资源情况和任务需求。
