多线程

线程池是如何实现线程复用的

1352 阅读

线程池通过维护 Worker 对象实现复用。execute 先在核心线程数范围内尝试 addWorker 创建线程,若达上限则把任务放入 workQueue。Worker 持有 Thread 并实现 Runnable,其 run 方法调用 runWorker。runWorker 在循环中先执行 firstTask,再不断从队列获取任务并执行 task.run();run 本身不再创建新线程,线程始终在同一 Thread 上循环处理任务直至关闭。于是同一线程被重复利用,完成线程复用的核心机制。

AQS源码分析

1432 阅读

AQS(AbstractQueuedSynchronizer)通过 volatile 的 state 与 CLH 双向链表实现同步,维护 head、tail 指向的等待队列。它支持独占和共享两种模式,核心方法 acquire/release 与 acquireShared/releaseShared 采用模板方法,子类只需实现 tryAcquire/tryRelease 或对应的共享 try 方法。Node 类保存线程、前后指针、waitStatus(CANCELLED、SIGNAL、CONDITION、PROPAGATE)等信息。文中以自定义 Mutex 为例展示独占同步器的实现,包括 tryAcquire、tryRelease、ConditionObject 的使用,并分析 acquire、addWaiter、enq 等源码流程,说明线程如何加入等待队列并竞争资源。