面试官问如何实现线程复用时,可能确实指的是线程池的工作原理。线程池是一种管理和复用线程的机制,它可以提高线程的利用率和性能。
首先判断线程池里的核心线程是否都在执行任务,如果不是则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给拒绝策略来处理这个任务。
线程池的工作原理如下:
1. 创建线程池:首先,创建一个线程池,它包含一定数量的线程,这些线程可以被复用来执行任务。
2. 任务提交:当有任务需要执行时,将任务提交给线程池。任务可以是实现了Runnable或Callable接口的对象。
3. 任务排队:线程池会维护一个任务队列,所有提交的任务都会被放入队列中等待执行。
4. 线程复用:线程池中的线程会不断地从任务队列中获取任务并执行。一个线程执行完一个任务后,可以立即去执行下一个任务,而不需要每次都创建和销毁线程,从而实现线程的复用。
5. 控制线程数量:线程池根据设定的参数来控制线程的数量。例如,可以设置线程池的最大线程数、核心线程数以及空闲线程的存活时间等。
6. 任务执行:线程池会根据线程的可用性和任务队列中的任务情况来决定如何分配任务给线程。一般来说,线程池会优先使用空闲线程执行任务,如果没有空闲线程,则会根据设定的策略决定是否创建新的线程来执行任务。
7. 销毁线程池:在不需要线程池时,可以显式地将线程池关闭,释放相关资源。
因此,当面试官问到如何实现线程复用时,可以回答线程池的工作原理,包括任务提交、任务排队、线程复用和线程数量控制等方面的内容。同时,还可以介绍一些线程池的相关参数和调优策略,以展示对线程池的深入理解。
**线程池的核心参数有哪些?
1. corePoolSize 核心线程数目 - 池中会保留的最多线程数
2. maximumPoolSize 最大线程数目 - 核心线程+救急线程的最大数目
3. keepAliveTime 生存时间 - 救急线程的生存时间,生存时间内没有新任务,此线程资源会释放
4. unit 时间单位 - 救急线程的生存时间单位,如秒、毫秒等
5. workQueue - 当没有空闲核心线程时,新来任务会加入到此队列排队,队列满会创建救急线程执行任务
6. threadFactory 线程工厂 - 可以定制线程对象的创建,例如设置线程名字、是否是守护线程等
7. handler 拒绝策略 - 当所有线程都在繁忙,workQueue 也放满时,会触发拒绝策略
在拒绝策略中又有4中拒绝策略
当线程数过多以后,第一种是抛异常、第二种是由调用者执行任务、第三是丢弃当前的任务,第四是丢弃最早排队任务。默认是直接抛异常。