作者:你的念头_780 | 来源:互联网 | 2024-12-07 15:43
在线程池的任务添加过程中,ctl属性起着至关重要的作用。该属性由两部分组成:前三位表示线程池的运行状态,后29位记录当前线程池中的线程数量。
当尝试向线程池添加新任务时,首先需要获取线程池的当前状态。如果线程池处于STOP、TIDYING或TERMINATED状态,新任务将不会被接受,直接返回false。若线程池处于SHUTDOWN状态,仅当没有待处理任务时才允许添加新的工作线程,否则不允许创建新线程。
为了保证线程池的安全性和效率,任务添加过程采用了自旋锁机制。具体来说,系统会检查即将添加的工作线程是否属于核心线程池范围。如果是,将判断当前工作线程的数量是否超过了核心线程池的大小;如果不是,则判断是否超过了最大线程池大小。如果工作线程数量已经超出限制,将直接返回false。反之,系统将尝试通过CAS(Compare and Swap)操作原子性地增加工作线程计数。一旦增加成功,流程将继续;如果失败,系统将再次检查线程池状态,如果状态发生变化,整个过程将重新开始。
当上述条件均满足后,将创建一个新的Worker对象。在获取重入锁后,再次检查线程池状态。如果此时线程池状态变为STOP、TIDYING或TERMINATED,系统将减少工作线程计数,并调用tryTerminate方法尝试终止线程池,同时返回false。这一过程确保了即使在多线程环境下,也能准确控制线程池的行为。
值得注意的是,ctl属性巧妙地结合了运行状态和工作线程计数,利用高三位表示运行状态。双层for循环的设计是为了应对CAS操作可能失败的情况,内层循环处理因CAS失败但线程状态未变而导致的重试,外层循环则处理因线程池状态变化导致的整体重试。