码迷,mamicode.com
首页 > 编程语言 > 详细

java线程池源码的简单分析

时间:2019-12-28 13:24:37      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:时间设置   runnable   run   inf   回收   工作任务   executors   nbsp   future   

  工作中用过线程池来进行多线程的操作,但是也仅仅是停留在使用方面,没有深入研究,现在通过源码来仔细研究下java的线程池。关于线程池的优缺点就不研究了,直接通过一个源码来看看java中线程池的原理。

  使用ThreadPoolExecutor来创建一个线程池

public class MultipleThread {
    public static void main(String[] args) {
        /**
         * 通过ThreadPoolExecutor来创建一个线程池
         *
         * 我们创建的线程池  核心线程数为10,最大线程数为10,也就是线程池的大小就是为10个线程
         *
         * 非核心线程的在没有任务执行的时候存活的时间设置为0,时间单位是毫秒(设置为0意味着不过期,不会超时被回收)
         * 
         * LinkedBlockingQueue作为工作队列,用于存储工作任务
         */

        ExecutorService executorService = new ThreadPoolExecutor(10, 10,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());
        Future<?> a = executorService.submit(() ->
            System.out.println("当前线程:" + Thread.currentThread().getName())
        );
        Future<?> aa = executorService.submit(() ->
                System.out.println("当前线程:" + Thread.currentThread().getName()));
        Future<?> aaa = executorService.submit(() ->
                System.out.println("当前线程:" + Thread.currentThread().getName()));
        Future<?> aaaa = executorService.submit(() ->
                System.out.println("当前线程:" + Thread.currentThread().getName()));
        Future<?> aaaaa = executorService.submit(() ->
                System.out.println("当前线程:" + Thread.currentThread().getName()));

    }
}

  我们通过ThreadPoolExecutor的构造函数来看看线程池是怎么创建的

技术图片

 ThreadPoolExecutor构造方法:技术图片

   提交一个任务

技术图片

 

提交任务后,其实是调用execute方法去向工作队列添加任务的,我们接着看这个execute方法的实现。

技术图片

 

总结就是:

1、当前活动线程数小于核心线程数,则创建一个核心线程,并执行提交的任务

2、当前活动线程数大于等于核心线程数,并且队列可以添加任务,则将任务添加到队列中去

3、当前活动线程数大于等于核心线程数,并且队列不能添加任务(队列满了),则创建一个非核心线程来处理提交的任务

 

接下来我们看addWorker这个方法

技术图片

 

 接下来我们看runWorker方法

技术图片

 

 我们再看下getTask()方法,这个方法就是线程复用的关键方法。

技术图片

 

好了,初步的源码分析就到这儿。

java线程池源码的简单分析

标签:时间设置   runnable   run   inf   回收   工作任务   executors   nbsp   future   

原文地址:https://www.cnblogs.com/guolinjiang/p/12111281.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!