带着几个问题进入源码分析:
线程池是什么时候创建线程的?
任务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("[email protected]" + Thread.currentThread().getName()); sleepTime(); System.out.println(1); }); //检查当前池中线程数大小是否小于core number, 如果是,则创建新线程 executorService.execute(() -> { System.out.println("[email protected]" + Thread.currentThread().getName()); sleepTime(); System.out.println(2); }); // 检查当前池中线程数大小是否小于core number, 如果不是,则偿试放入队列 // 这个任务是加到队列去的, 注意队列大小只有1, // TODO 队列中的任务是什么时候取出来的? executorService.execute(() -> { System.out.println("[email protected]" + Thread.currentThread().getName()); sleepTime(); System.out.println(3); }); // 检查当前池中线程数大小是否小于core number, 如果不是,则偿试放入队列,放入队列也失败,则增加新的worker线程 // 这个任务是加到core以外的新线程去的 executorService.execute(() -> { System.out.println("[email protected]" + Thread.currentThread().getName()); sleepTime(); System.out.println(4); }); }
第3行,创建一个核心池2, 最大池5, 队列为1的线程池
执行第一个execute时,进入调试jdk源码
代码块1
第一个if, 判断如果当前线程数小于corePoolSize, 则创建新的核心worker对象(Worker中指向Thread对象,保持引用,保证不会被GC回收)
我们的示例代码中,第1和第2个线程都是这样创建出线程的
原文地址:https://www.cnblogs.com/yszzu/p/10122658.html
时间: 2024-11-09 12:17:30