1.线程池
Java线程池是Java并发编程中非常重要的一部分,它允许我们创建和管理一组线程,这些线程可以执行提交给线程池的任务。优点如下:
优点 | 描述 |
---|---|
降低资源消耗 | 通过重复利用已创建的线程,避免频繁创建和销毁线程带来的性能开销 |
提高响应速度 | 当任务到达时,任务可以不需要等到线程创建就能立即执行 |
提高线程的可管理性 | 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控 |
2.Executors类
(1)Executors类的作用
线程池的工具类通过调用方法返回不同类型的线程池对象
(2)Executors类常用方法
方法 | 描述 |
---|---|
public static ExecutorService newCachedThreadPool() | 创建一个缓存线程池,其线程数量几乎是无限的,当线程处于空闲状态超过60秒,就会被自动回收 |
public static ExecutorService newFixedThreadPool(int nThreads) | 创建一个固定大小的线程池,其核心线程数和最大线程数都是指定的固定值 |
public static ExecutorService newSingleThreadExecutor() | 创建一个单线程线程池,只有一个线程执行任务,所有任务按照提交顺序依次执行 |
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) | 创建一个支持定时及周期性任务执行的线程池 |
3.线程池代码案例
public class MyThread implements Runnable{
@Override
public void run() {
for(int i = 0; i < 3; i++){
System.out.println(Thread.currentThread().getName() + "执行第" + i + "次输出");
}
}
}
public class Demo {
public static void main(String[] args) {
// 获取线程池对象
ExecutorService threadPool = Executors.newFixedThreadPool(2);
// 向线程池提交任务
threadPool.submit(new MyThread());
threadPool.submit(new MyThread());
threadPool.submit(new MyThread());
// 关闭线程池
threadPool.shutdown();
}
4.自定义线程池
(1)线程池的主要参数
参数 | 描述 | 约束 |
---|---|---|
corePoolSize | 核心线程数,核心线程处于空闲状态,也不会被销毁 | 不能小于0 |
maximumPoolSize | 线程池允许的最大线程数 | 大于等于核心线程数量 |
keepAliveTime | 当线程数大于核心线程数时,这是多余的空闲线程在终止前等待新任务的最长时间 | 不能小于0 |
unit | keepAliveTime的时间单位,通常是TimeUnit.SECONDS | 用TimeUnit指定 |
workQueue | 用于保存等待执行的任务的阻塞队列 | 不能为null |
ThreadFactory | 用于创建新线程的线程工厂,可以通过它自定义线程的创建方式 | 不能为null |
RejectedExecutionHandler | 当线程池无法处理新任务时(即任务队列已满,且线程池中的线程数已达到最大值),该处理器会定义处理策略 | 不能为null |
(2)临时线程的创建时期
核心线程都在处理任务且任务阻塞队列已满
(3)任务拒绝策略
任务拒绝策略 | 说明 |
---|---|
ThreadPoolExecutor.AbortPolicy | 默认策略,丢弃任务并抛出RejectedExecutionException异常 |
ThreadPoolExecutor.DiscardPolicy | 丢弃任务,但是不抛出异常(不推荐) |
ThreadPoolExecutor.DiscardOldestPolicy | 抛弃队列中等待最久的任务,然后把当前任务加入到队列中 |
ThreadPoolExecutor.CallerRunsPolicy | 调度任务的run()方法绕过线程池直接执行 |
(4)自定义线程池代码案例
ThreadPoolExecutor pool = new ThreadPoolExecutor(
3, // 核心线程数
5, // 最大线程数
60, // 存活时间(值)
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(3), // 阻塞队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
标签:Java,创建,任务,线程,new,public,ThreadPoolExecutor
From: https://blog.csdn.net/Lyhdreamer/article/details/137370058