面试题答案
一键面试- 计算I/O密集型任务线程数:
- 对于I/O密集型任务,线程大部分时间都在等待I/O操作完成,而不是占用CPU。经验法则是可以设置线程数为CPU核心数的2倍甚至更多。因为在I/O等待时,CPU处于空闲状态,多线程可以充分利用CPU的空闲时间。
- 这里CPU核心数为8,I/O密集型任务线程数可以设置为16(2 * 8)。
- 计算CPU密集型任务线程数:
- CPU密集型任务主要消耗CPU资源,理想情况下线程数应该等于CPU核心数,这样可以充分利用每个CPU核心,避免线程过多导致上下文切换开销过大。所以对于少量的CPU密集型任务,线程数可以设置为8。
- 综合设置线程池最大线程数:
- 由于应用主要处理I/O密集型任务和少量CPU密集型任务,整体线程池的最大线程数应以I/O密集型任务为主导。
- 综合考虑,线程池最大线程数可以设置为24(16(I/O密集型任务线程数) + 8(CPU密集型任务线程数))。这样既可以充分利用CPU资源处理CPU密集型任务,又能通过多线程高效处理I/O密集型任务,减少I/O等待时间,提升整体应用在高并发场景下的性能。
原因:设置合理的线程数可以避免线程过多导致的上下文切换开销过大,同时充分利用CPU和I/O资源。对于I/O密集型任务,多线程可以在I/O等待时让CPU处理其他任务;对于CPU密集型任务,线程数等于CPU核心数可以避免过度竞争CPU资源。综合两者设置线程池最大线程数,能适应应用中不同类型任务的特点,优化高并发性能。