线程池ThreadPoolExecutor分析: 线程池是什么时候创建线程的,队列中的任务是什么时候取出来的?

带着几个问题进入源码分析:

线程池是什么时候创建线程的?

任务runnable task是先放到core到maxThread之间的线程,还是先放到队列?

队列中的任务是什么时候取出来的?

什么时候会触发reject策略?

core到maxThread之间的线程什么时候会die?

task抛出异常,线程池中这个work thread还能运行其他任务吗?

至少在new ThreadPoolExecutor()时,Thread对象并没有初始化. 这里仅仅指定了几个初始参数

一段基础代码,进入分析

public static void main(String[] args) {

        ExecutorService executorService = new ThreadPoolExecutor(2, 5, 0, TimeUnit.DAYS,
                new ArrayBlockingQueue<>(1), new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread thread = new Thread(r);
//                thread.setDaemon(true);
                return thread;
            }
        });
        // 对象创建后,线程实际还没开始创建

        // 执行execute时,检查当前池中线程数大小是否小于core number, 如果是,则创建新线程
        executorService.execute(() -> {
            System.out.println("1@" + Thread.currentThread().getName());
            sleepTime();
            System.out.println(1);
        });

        //检查当前池中线程数大小是否小于core number, 如果是,则创建新线程
        executorService.execute(() -> {
            System.out.println("2@" + Thread.currentThread().getName());
            sleepTime();
            System.out.println(2);
        });

        // 检查当前池中线程数大小是否小于core number, 如果不是,则偿试放入队列
        // 这个任务是加到队列去的, 注意队列大小只有1,
        // TODO 队列中的任务是什么时候取出来的?
        executorService.execute(() -> {
            System.out.println("3@" + Thread.currentThread().getName());
            sleepTime();
            System.out.println(3);
        });

        // 检查当前池中线程数大小是否小于core number, 如果不是,则偿试放入队列,放入队列也失败,则增加新的worker线程
        // 这个任务是加到core以外的新线程去的
        executorService.execute(() -> {
            System.out.println("4@" + Thread.currentThread().getName());
            sleepTime();
            System.out.println(4);
        });
    }

  

第3行,创建一个核心池2, 最大池5, 队列为1的线程池

执行第一个execute时,进入调试jdk源码

代码块1

第一个if, 判断如果当前线程数小于corePoolSize, 则创建新的核心worker对象(Worker中指向Thread对象,保持引用,保证不会被GC回收)

我们的示例代码中,第1和第2个线程都是这样创建出线程的

猜你喜欢

转载自www.cnblogs.com/yszzu/p/10122658.html