java线程池源码解析

1.从提交Runnable开始

2. 具体流程(简化代码)

public void execute(Runnable command) {
	addWorker(command);
}
 private boolean addWorker(Runnable firstTask, boolean core) {
 	 w = new Worker(firstTask);
 	 //Worker中的Thread对象,真正执行工作的线程
     final Thread t = w.thread;
     //重要代码,会执行Worker中的run方法,进而执行runWorker()方法
     t.start();
 }
private final class Worker implements Runnable{
	final Thread thread; 
	//firstTask肯定是先被执行的,随后新建的这个线程就会从任务队列中不断getTask(),没有Task则阻塞
    Runnable firstTask;
    
    Worker(Runnable firstTask) {
   	setState(-1); // inhibit interrupts until runWorker
    this.firstTask = firstTask;
    //注意此处,newThread时将自己传入了
    //和上面联系起来
    this.thread = getThreadFactory().newThread(this);
    }
    
    public void run() {
       runWorker(this);
    }
}
final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            while (task != null || (task = getTask()) != null){
            	task.run();
            }
private Runnable getTask() {
        boolean timedOut = false; // Did the last poll() time out?

        for (;;) {
            try {
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }

总结:

1.为啥工作线程在firstTask结束后没有die? 因为内部有getTask(),是死循环,从阻塞队列中当取task时,取不到则阻塞
2.Woker对象,是一个封装线程的Runnable,addWoker内部,会执行Worker中的thread.start,进而执行runWoker,从而不断的获取task,执行task

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值