面试题答案
一键面试I/O密集型任务
- SynchronousQueue
- 选择依据:I/O密集型任务等待I/O操作完成的时间长,线程在大部分时间处于等待状态,使用SynchronousQueue能快速将任务传递给线程执行,避免队列积压。因为SynchronousQueue没有容量,任务提交时必须有线程准备好接收任务,适合这种需要快速响应的场景。
- 调优思路:线程池核心线程数应设置得较大,以充分利用系统资源,比如设置为CPU核心数的2倍甚至更多。因为任务等待I/O时,其他线程可继续工作。同时,最大线程数也应适当设置大一些,以应对突发的高并发任务。
- PriorityBlockingQueue
- 选择依据:如果I/O密集型任务中有不同优先级的任务,PriorityBlockingQueue能保证高优先级任务优先执行。例如,某些对响应时间要求极高的I/O任务可设置为高优先级。
- 调优思路:合理设置任务的优先级,核心线程数和最大线程数同样可适当增大。同时要注意PriorityBlockingQueue中任务的比较逻辑要准确,避免优先级设置混乱。
CPU密集型任务
- SynchronousQueue
- 选择依据:CPU密集型任务执行时间相对较短,SynchronousQueue能减少任务在队列中的等待时间,直接交给线程处理,减少线程切换开销。
- 调优思路:线程池核心线程数一般设置为CPU核心数,最大线程数也不宜设置过大,避免过多线程竞争CPU资源导致性能下降。可根据实际情况微调核心线程数,例如在超线程CPU上,核心线程数可适当增加。
- PriorityBlockingQueue
- 选择依据:当CPU密集型任务有优先级之分时,PriorityBlockingQueue能确保重要任务优先执行。比如一些关键的计算任务需要优先处理。
- 调优思路:精确设置任务优先级,核心线程数设置为CPU核心数或略多(如超线程场景)。同时监控任务执行情况,避免高优先级任务长时间占用CPU导致低优先级任务饿死。