1.线程池概念
线程池的七个参数:
-
corePoolSize:核心线程数。线程池中始终保持的线程数量,即使它们处于空闲状态。超过这个数量的线程会根据需要创建。
-
maximumPoolSize:最大线程数。线程池中允许的最大线程数量。当任务数量超过核心线程数时,可以创建新的线程,直到达到这个最大值。
-
keepAliveTime:线程的最大空闲时间。超过这个时间后,空闲线程会被终止,直到线程数量减少到核心线程数。
-
unit:
keepAliveTime
的时间单位(如TimeUnit.SECONDS
、TimeUnit.MILLISECONDS
等)。 -
workQueue:用于存储待执行任务的阻塞队列。可以是不同类型的队列,如
LinkedBlockingQueue
、ArrayBlockingQueue
、SynchronousQueue
等。 -
handler:拒绝策略。当线程池无法处理更多任务时,决定如何处理新提交的任务。可以选择的策略包括:
AbortPolicy
(默认)CallerRunsPolicy
DiscardPolicy
DiscardOldestPolicy
-
threadFactory(可选):用于创建新线程的工厂。可以自定义线程的名称、优先级等属性。
补充:
* 默认 拒绝策略是 AbortPolicy,直接抛出异常RejectedExecutionException * DiscardPolicy 直接丢弃任务 * DiscardOldestPolicy 丢弃阻塞队列中最早的任务 * CallerRunsPolicy 由调用者线程执行任务 * * 默认 阻塞队列 是 LinkedBlockingQueue 由链表结构组成的有界阻塞队列 * ArrayBlockingQueue 由数组结构组成的有界阻塞队列 * PriorityBlockingQueue 支持优先级排序的无界阻塞队列 * SynchronousQueue 不存储元素的阻塞队列 * * 可省项:线程工厂 和 拒绝策略
2.线程池Demo
2.1线程工厂(可省项)
/**
* 线程工厂
*/
public class MyThreadFactory implements ThreadFactory {
private int threadNum = 0;
/**
* 在这里可以 定义线程 的 name,和线程的其他属性
* @param r a runnable to be executed by new thread instance
* @return
*/
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("myThread - " + threadNum);
threadNum++;
return thread;
}
}
2.2Runnable任务
/**
* Runnable 任务 重写run方法
*/
public class TaskRunnableWithTimeSleep implements Runnable{
private String taskName;
public TaskRunnableWithTimeSleep() {
}
TaskRunnableWithTimeSleep(String name){
taskName = name;
}
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + " 执行 " + taskName + " 方法,没有返回值");
}
}
2.3线程池测试类
public class Main01 {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
4,// 核心线程数
5,// 最大核心线程数
10,// 临时线程的存活时间
TimeUnit.MILLISECONDS,// 时间单位
new ArrayBlockingQueue<>(2),// 阻塞队列可以存储两个任务
new MyThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
// 模拟同时执行 10 个任务
for (int i = 0; i < 10; i++) {
threadPoolExecutor.execute(new TaskRunnableWithTimeSleep("任务" + i));
}
threadPoolExecutor.shutdown();
}
}
2.4执行结果
当前设置最大线程数为5,阻塞队列大小为2;模拟同时执行10个任务,由于拒绝策略是AbortPolicy(阻塞队列为满,则直接抛出异常)。所以结果抛出异常,然后执行了7个任务