【架构师技能篇】Worker初识

本文详细介绍了Java线程池内部类Worker的工作原理,包括Worker的身份、创建与销毁过程,以及如何获取并执行任务。Worker是线程池中的工作线程,实现了Runnable并持有AQS锁。在addWorker()方法中创建Worker对象并启动线程,当无法获取任务或线程结束时,Worker将被销毁。线程通过runWorker()方法不断从任务队列获取并执行任务,实现线程的重复利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Worker的真实身份

Worker是线程池的内部类。包装了一个线程来不断的执行任务。线程池中的每个线程都被包装成了Worker类,它具有以下特点:

1、它实现了Runnable,内部线程start后,执行的就是Worker本身的run方法。

2、它继承了AQS,实现了一个不可重入的独占锁,执行任务期间加锁。线程池可以通过tryLock来判断Worker是不是正在执行任务。

二、Worker的创建与销毁

1、Worker的创建

线程池在接收提交任务阶段,会根据当前线程数量,决定是否创建线程。如下代码:

public void execute(Runnable command) {
       if (command == null)
           throw new NullPointerException();
       int c = ctl.get();
       if (workerCountOf(c) < corePoolSize) {
           if (addWorker(command, true))
               return;
           c = ctl.get();
       }
       if (isRunning(c) && workQueue.offer(command)) {
           int recheck = ctl.get();
           if (! isRunning(recheck) && remove(command))
               reject(command);
           else if (workerCountOf(recheck) == 0)
               addWorker(null, false);
       }
       else if (!addWorker(command, false))
           reject(command);
   }

通过上面的源代码,我们会发现有三个地方调用addWorker()方法,而此方法的内部则会创建Worker对象,并完成提交任务的执行。下面,来看看Worker的内部结构:

private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
   
   private static final long serialVersionUID = 6138294804551838833L;

   /** 线程池里的真正的线程,负责执行提交的任务。*/
   final Thread thread;
   /**Worker线程执行的第一个任务,如果创建的是核心线程的Worker则提交的任务会赋值给此属性。此值可为空*/
   Runnable firstTask;
   /** 当前线程已完成的任务数,每次执行玩一个提交的任务,此值+1 */
   volatile long completedTasks;
}  

接下来,我们看下构造函数:

Worker(Runnable firstTask) {
   setState(-1); // inhibit interrupts until runWorker
   this.firstTask = firstTask;
   this.thread = getThreadFactory().ne

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值