@@ -65,8 +65,30 @@ new Thread弊端:
6565* 线程缺乏统一管理,可以无限制的新建线程,导致OOM。线程池可以控制可以创建、执行的最大并发线程数。
6666* 缺少工程实践的一些高级的功能如定期执行、线程中断。线程池提供定期执行、并发数控制功能
6767
68- [ http://www.wangtianyi.top/blog/2018/05/08/javagao-bing-fa-wu-xian-cheng-chi/ ] ( http://www.wangtianyi.top/blog/2018/05/08/javagao-bing-fa-wu-xian-cheng-chi/ )
69- [ https://www.jianshu.com/p/edd7cb4eafa0 ] ( https://www.jianshu.com/p/edd7cb4eafa0 )
68+ #### 线程池时核心参数
69+
70+ * corePoolSize:核心线程数量,线程池中应该常驻的线程数量
71+ * maximumPoolSize:线程池允许的最大线程数,非核心线程在超时之后会被清除
72+ * workQueue:阻塞队列,存储等待执行的任务
73+ * keepAliveTime:线程没有任务执行时可以保持的时间
74+ * unit:时间单位
75+ * threadFactory:线程工厂,来创建线程
76+ * rejectHandler:当拒绝任务提交时的策略(抛异常、用调用者所在的线程执行任务、丢弃队列中第一个任务执行当前任务、直接丢弃任务)
77+
78+ #### 创建线程的逻辑
79+ 以下任务提交逻辑来自ThreadPoolExecutor.execute方法:
80+
81+ 1 . 如果运行的线程数 < corePoolSize,直接创建新线程,即使有其他线程是空闲的
82+ 2 . 如果运行的线程数 >= corePoolSize
83+ 2.1 如果插入队列成功,则完成本次任务提交,但不创建新线程
84+ 2.2 如果插入队列失败,说明队列满了
85+ 2.2.1 如果当前线程数 < maximumPoolSize,创建新的线程放到线程池中
86+ 2.2.2 如果当前线程数 >= maximumPoolSize,会执行指定的拒绝策略
87+
88+ #### [ 阻塞队列的策略] ( https://blog.csdn.net/hayre/article/details/53291712 )
89+ * 直接提交。SynchronousQueue,它将任务直接提交给线程而不保持它们。如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集时出现锁。直接提交通常要求无界maximumPoolSizes 以避免拒绝新提交的任务。
90+ * 无界队列。使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue)将导致在所有 corePoolSize线程都忙时新任务在队列中等待。这样,创建的线程就不会超过 corePoolSize。(因此,maximumPoolSize的值也就无效了。)当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;例如,在 Web页服务器中。这种排队可用于处理瞬态突发请求,当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。
91+ * 有界队列。当使用有限的 maximumPoolSizes 时,有界队列(如ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
7092
7193### 并发包工具类
7294[ http://www.wangtianyi.top/blog/2018/05/01/javagao-bing-fa-xi-lie-si-:juc/ ] ( http://www.wangtianyi.top/blog/2018/05/01/javagao-bing-fa-xi-lie-si-:juc/ )
0 commit comments