ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### ThreadPoolExecutor ``` public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler); ``` * **corePoolSize** 线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行;如果执行了线程池的prestartAllCoreThreads\(\)方法,线程池会提前创建并启动所有核心线程; * **maximumPoolSize** 线程池中允许的最大线程数。如果当前阻塞队列满了,且继续提交任务,则创建新的线程执行任务,前提是当前线程数小于maximumPoolSize; * **keepAliveTime** 线程空闲时的存活时间,即当线程没有任务执行时,继续存活的时间;默认情况下,该参数只在线程数大于corePoolSize时才有用; * **unit** keepAliveTime的单位; * **workQueue** 用来保存等待被执行的任务的阻塞队列,且任务必须实现Runable接口,在JDK中提供了如下阻塞队列: 1. ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务; 2. LinkedBlockingQuene:基于链表结构的阻塞队列,按FIFO排序任务,吞吐量通常要高于ArrayBlockingQuene; 3. SynchronousQuene:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQuene; 4. priorityBlockingQuene:具有优先级的无界阻塞队列; * **threadFactory** 创建线程的工厂,通过自定义的线程工厂可以给每个新建的线程设置一个具有识别度的线程名 ``` static class DefaultThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; DefaultThreadFactory() { SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-"; } public Thread newThread(Runnable r) { Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon()) t.setDaemon(false); if (t.getPriority() != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY); return t; } } ``` 知识点 * maximumPoolSize不能小于corePoolSize * Executors.newFixedThreadPool\(\); corePoolSize = maximumPoolSize 运行原理: 1. 当线程池线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程; 2. 当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行; 3. 当workQueue已满,且maximumPoolSize&gt;corePoolSize时,新提交任务会创建新线程执行任务; 4. 当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理; 5. 当线程池中线程超过corePoolSize线程,且线程空闲时间达到keepAliveTime时,关闭空闲线程; 6. 当设置allowCoreThreadTimeOut\(true\)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭; 实例: 并不是先加入任务就一定会先执行。假设队列大小为 10,corePoolSize 为 3,maximumPoolSize 为 6,那么当加入 20 个任务时,执行的顺序就是这样的:首先执行任务 1、2、3,然后任务 4~13 被放入队列。这时候队列满了,任务 14、15、16 会被马上执行,而任务 17~20 则会抛出异常。最终顺序是:1、2、3、14、15、16、4、5、6、7、8、9、10、11、12、13 流程图: ![](https://img.kancloud.cn/a0/08/a008b8521914b56e8dabe50a54e13669_885x340.png) ![](https://img.kancloud.cn/6f/f8/6ff8e37e4a2a9e2091376d59019f8e0d_814x54.png)