上海某小公司面试题:Java线程池来聊聊

核心概念说白了就是省事。
线程复用减少创建销毁开销,控制数量防炸。

实现原理就是流程。
提交任务先看线程够不够,不够就排队。
队列满了再开新线程,最后用拒绝策略。

关键参数要盯紧。
核心线程数别乱设,最大线程数别太大。
队列选对,不然OOM了。
拒绝策略得配。

线程池类型别乱用。
FixedThreadPool固定人数,CachedThreadPool无限开。
生产环境别用Executors,风险大。

监控指标很重要。
核心线程数、活动线程数、任务队列大小这些得随时看。

最佳实践记住:CPU密集型任务线程数等于CPU核数。
IO密集型任务多开点。
异常必须catch,不然线程停了。
优雅关闭用shutdown+awaitTermination。

面试官最爱问:线程复用就是循环拿任务。
Executors不推荐因为队列没限制。
队列选啥看场景,无界队列入内存,同步队列入线程。

深入源码看addWorker和Worker类。
跟踪线程全过程最好。

一文带你搞清楚Python的多线程和多进程

多线程I/O密集,少GIL影响快。
多进程CPU密集,多核并行更高效。
线程池复用线程,减少开销提升效。
进程池复用进程,多核并行更强大。
任务密集选进程,I/O密集选线程。
线程池3 -1 0为佳,进程池依核数定。
任务分配要合理,资源利用更高效。
异常及时处理,稳定可靠保安全。
监控调优是关键,性能瓶颈快解决。

Java线程池的工作原理

上周,我在公司技术分享会上,听同事详细介绍了Java线程池的工作原理。
这东西,简直就像一个高效的生产流水线,不仅能预创建线程,还能根据任务量动态调整线程数量,真是厉害。

2 02 3 年,我发现我那个朋友的公司,他们用的线程池,核心线程数是1 0,最大线程数是5 0。
他们还设置了一个任务队列,用的是LinkedBlockingQueue,听说可以无限堆积任务。

他告诉我,如果任务太多,线程池会根据设置的最大线程数创建新线程。
如果任务执行完毕,线程会回到线程池等待新任务。
不过,如果空闲时间超过设定的keepAliveTime,非核心线程就会被回收。

配置线程池的时候,得注意几个参数,比如核心线程数、最大线程数、任务队列类型等。
他们公司用的拒绝策略是CallerRunsPolicy,就是由提交任务的线程来执行任务。

说到这里,我刚想到另一件事,就是要注意线程数配置。
得根据任务是CPU密集型还是IO密集型来调整。
CPU密集型任务,线程数一般和CPU核心数相当;而IO密集型任务,线程数可以适当增加。

而且,使用线程池的时候,还要注意死锁、线程泄漏和共享数据竞争等问题。
他们公司是通过监控线程池状态,比如活跃线程数和队列大小,来及时调整参数的。

总的来说,线程池这东西,用得好,确实能提高应用效率。
不过,配置和管理起来也有学问,得小心操作。
你看着办吧,这事儿挺复杂的。
算了。