Java 并发面试题, 你了解 Java 线程池的原理吗?
Java 并发面试题, 你了解 Java 线程池的原理吗?
QA
Step 1
Q:: 什么是Java线程池?
A:: Java线程池是一种基于线程复用的并发处理机制。通过维护一定数量的线程(工作线程),可以重复使用这些线程执行多个任务,从而减少了线程创建和销毁的开销,提高了应用程序的性能。
Step 2
Q:: Java线程池的工作原理是什么?
A:: Java线程池通过Executor框架实现。它维护一个任务队列和若干工作线程。提交的任务首先进入任务队列,线程池中的空闲线程会不断从任务队列中取出任务并执行。如果所有线程都在忙碌,新提交的任务会在任务队列中等待。线程池通过控制线程的数量来优化系统资源的使用。
Step 3
Q:: Java线程池有哪些常见的实现类?
A:: Java中提供了多种线程池实现类,包括FixedThreadPool(固定线程数线程池)、CachedThreadPool(缓存线程池)、ScheduledThreadPool(调度线程池)、SingleThreadExecutor(单线程执行器)等。这些实现类在不同的场景下有不同的应用。
Step 4
Q:: 如何创建一个Java线程池?
A:: 可以使用Executors工厂类来创建线程池,例如:ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
。也可以使用ThreadPoolExecutor类创建更具自定义化的线程池。
Step 5
Q:: 什么是ThreadPoolExecutor?其核心参数有哪些?
A:: ThreadPoolExecutor是Java中最核心的线程池实现类。其核心参数包括:corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(空闲线程的存活时间)、unit(时间单位)、workQueue(任务队列)、threadFactory(线程工厂)、handler(拒绝策略)。
Step 6
Q:: Java线程池有哪些常见的拒绝策略?
A:: 常见的拒绝策略包括:AbortPolicy(抛出异常)、CallerRunsPolicy(调用者运行策略)、DiscardPolicy(直接丢弃策略)、DiscardOldestPolicy(丢弃最旧的任务)。这些策略用于处理线程池无法接受新任务的情况。
Step 7
Q:: 什么是Future和Callable?
A:: Future和Callable用于获取任务的执行结果。Callable是一个具有返回值的任务接口,而Future用于表示异步计算的结果,可以通过get()
方法获取计算结果或等待计算完成。