ThreadPoolExecutor
ThreadPoolExecutor构造方法的七个参数
-
int corePoolSize核心线程的数量,不能小于0
-
int maximumPoolSize最大线程数,不能小于0,最大数量 >= 核心线程数量
-
long keepAliveTime空闲线程最大存活时间,不能小于0
-
TimeUnit unit时间单位
-
BlockingQueue<Runnable> workQueue任务队列,不能为null
-
ThreadFactory threadFactory创建线程工厂,不能为null
-
RejectedExecutionHandler handler任务的拒绝策略, 不能为null
MyRunnable类
package com.cmy.myThreadpool;
/**
* @author 陈明勇
*/
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "在执行了...");
}
}
测试类
package com.cmy.myThreadpool;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author 陈明勇
*/
public class MyThreadPoolDemo3 {
public static void main(String[] args) throws InterruptedException {
/**
* 1.核心线程的数量
* 2.最大线程数
* 3.空闲线程最大存活时间
* 4.时间单位
* 5.任务队列
* 6.创建线程工厂
* 7.任务的拒绝策略
*/
ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 5, 2, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
pool.submit(new MyRunnable());
pool.submit(new MyRunnable());
pool.shutdown();
}
}
pool.submit()调用此方法时,不使用lambda表达式,而是将MyRunnable类作为参数去执行
参数详解
-
TimeUnit unit时间单位TimeUnit是一个枚举类,如果单位不是秒而是小时,则可以这样使用 ->
TimeUnit.HOURS -
BlockingQueue<Runnable> workQueue任务队列让任务在队列中等着,等有线程空闲了,再获取任务并执行
-
ThreadFactory threadFactory创建线程工厂按照默认方式创建线程对象
-
RejectedExecutionHandler handler任务的拒绝策略-
① 什么时候拒绝任务
当提交的任务 > 池中最大线程数量 + 队列容量
-
② 如何去拒绝
-
任务拒绝策略
-
a.
ThreadPoolExecutor.AbortPolicy丢弃任务并抛出RejectedExecutionException异常,是默认的策略
-
b.
ThreadPoolExecutor.DiscardPolicy丢弃任务,但是不抛出异常,不推荐使用
-
c.
ThreadPoolExecutor.DiscardOlderstPolicy抛弃队列中等待最久的任务,然后把当前任务加入队列中
-
d.
ThreadPoolExecutor.CallerRunsPolicy调用任务的run()方法绕过线程池直接执行
-
-
-

本文深入解析了Java并发编程中的ThreadPoolExecutor构造方法,详细介绍了其七个参数的作用,包括核心线程数、最大线程数、空闲线程存活时间、时间单位、任务队列、线程工厂和任务拒绝策略。通过示例展示了如何创建线程池并提交任务,以及四种不同的任务拒绝策略的行为。理解这些参数有助于优化线程池配置,提高系统性能。
170万+

被折叠的 条评论
为什么被折叠?



