Open gaohanghang opened 5 years ago
原文来自 《码出高效:Java开发手册》
线程使应用能够更加充分合理地协调利用 CPU、内存、网络、I/O等系统资源。线程的创建需要开辟虚拟机栈、本地方法栈、程序计数器等线程私有的内存空间。在线程销毁时需要回收这些系统资源。频繁地创建和销毁线程会浪费大量的系统资源,增加并发编程风险。另外, 在服务器负载过大的时候, 如何让新的线程等待或者友好地拒绝服务?这些都是线程自身无法解决的。 所以需要通过线程池协调多个线程 , 并实现类似主次线程隔离、定时执行、周期执行等任务。 线程池的作用包括:
利用线程池管理并复用线程、控制最大并发数等。
实现任务线程队列缓存策略和拒绝机制。
实现某些与时间相关的功能,如定时执行、周期执行等。
隔离线程环境。比如,交易服务和搜索服务在同一台服务器上,分别开启两个线程池,交易线程的资源消耗明显更大;因此,通过配置独立的线程池,将较慢的交易服务与搜索服务隔离开,避免各服务线程相互影响。
在了解线程池的基本作用后, 我们学习下线程池是如何创建线程的。 首先从 ThreadPoolExecutor 构造方法讲起 , 学习如何自定义 ThreadFactory 和 RejectedExecutionHandler , 并编写一个最简单的线程池示例。 然后, 通过分析 ThreadPoolExecutor 的 execute 和 addWorker 两个核心方法, 学习如何把任务线程加入到线程池中运行。 ThreadPoolExecutor 的构造方法如下:
https://www.nowcoder.com/discuss/250485?type=2&order=3&pos=5&page=1
https://www.nowcoder.com/discuss/270890?type=2&order=0&pos=26&page=1
https://www.nowcoder.com/discuss/272576?type=2&order=3&pos=2&page=1
https://www.nowcoder.com/discuss/280129?type=2&order=3&pos=24&page=0
https://www.nowcoder.com/discuss/287424?type=2&order=0&pos=3&page=1
https://www.nowcoder.com/discuss/293917?type=2&order=3&pos=4&page=1
https://www.nowcoder.com/discuss/295747?type=2&order=0&pos=3&page=1