JDK 源码 - ThreadPoolExecutor
ThreadPoolExecutor 是 Java 的线程池实现,其中封装了对线程的管理(包括创建、调度、销毁等)及任务的分配等逻辑,作为核心并发组件,其中使用到了如阻塞队列、ReentrantLock、原子变量等并发包下的基础工具,由于前面看完了 ReentrantLock 等相关的源码,所以尝试窥探下 ThreadPoolExecutor 的工作过程。
……ThreadPoolExecutor 是 Java 的线程池实现,其中封装了对线程的管理(包括创建、调度、销毁等)及任务的分配等逻辑,作为核心并发组件,其中使用到了如阻塞队列、ReentrantLock、原子变量等并发包下的基础工具,由于前面看完了 ReentrantLock 等相关的源码,所以尝试窥探下 ThreadPoolExecutor 的工作过程。
……由于 JDK 1.7 的 ConcurrentHashMap 的实现使用到了 ReentrantLock,刚好前面也已经看过了 ReentrantLock 的实现,所以顺势看下 1.7 版本的 ConcurrentHashMap 是如何实现的。
……前面已经了解了 AbstractQueuedSynchronizer 和 ReentrantLock 的原理,接下来看看共享锁组件 CountDownLatch 是如何基于 AbstractQueuedSynchronizer 实现,在我看来,如果能先了解 AbstractQueuedSynchronizer 的运作过程,那么再看 CountDownLatch 会觉得比较容易理解。
……前面已经或粗或细地看过了 AbstractQueuedSynchronizer 的源码,不妨趁热打铁把其常见的实现的源码也翻一遍,于是我们先来看 ReentrantLock
内部是怎么实现的。
前段时间线上遇到 OOM
问题,定位到的原因是线程池创建线程的个数过多,导致内存不够用;为此好奇去看了眼线程池的源码,发现线程池会在调度任务执行时才会创建实际的线程对象,但是再往下看时遇到了不懂的东西,比如 AbstractQueuedSynchronizer
,没办法只好先把基础的组件搞明白。
很久之前我写了这么一个并发异步的工具方法,传入的 suppliers
是具体的业务方法函数引用,考虑这个一个业务场景,我们需要去数据库统计某个表最近一个月在某个条件下的数量,那么为了提高响应效率,可以通过按天切分日期,然后组装成相应的 supplier
,再通过多线程异步处理,最后统一收集完结果返回。