java线程池ThreadPoolExecutor内的线程是怎么循环接收任务不停工作的

1 创建线程池并提交一个任务

public class TerminalTest {

    public static void main(String[] args) {
		//5 是代表核心线程数
        ExecutorService poolExecutor = Executors.newFixedThreadPool(5);
        //提交任务
        poolExecutor.execute(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("finish task 1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

2 提交任务的原理源码解读-核心代码

2.1 添加任务本质上是将一个Runnable对象传递进线程池,调用addWorker方法来创建work对象执行任务。

在这里插入图片描述

2.2 注意上面说的work对象是线程池内的一个内部类Worker的实例,这个实例有两个属性一个是线程thread,一个是Runable对象即提交的要执行的任务。

Worker类

2.3 注意2.1内的addWorker方法作用是创建Worker对象并执行

在这里插入图片描述

2.4 Worker是实现了Runnable接口的,thread属性传递的Runnable参数是this,也就是说当上面图拿到Worker内的thread执行start方法时候就是运行Worker内的run方法

Worker构造方法

2.4 Worker内这个run方法内调用了runWorker方法传的是this(worker自己),这里要注意runWorker方法是线程池的,run方法是Worker这个内部类的。

在这里插入图片描述

3 runWorker方法

3.1 当前worker内绑定的线程执行worker内的Runnable代码,注意1127是一个循环

在这里插入图片描述

3.2 getTask方法

getTask()方法中如果take或者poll到了任务,就会到上图的去调用任务的run方法,注意此时代码所在的线程仍是最开始的worker对象绑定的线程。

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值