java中的线程池Executor

本文详细介绍了Java线程池的工作原理、核心参数及其影响,包括corePoolSize、maximumPoolSize、runnableTaskQueue等,并讨论了线程池的四种饱和策略。此外,还提到了ScheduledThreadPoolExecutor的特性和在Spring中使用线程池实现定时任务的情况。了解这些内容有助于优化系统性能和资源管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程池优点:

降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗

提高响应速度:当任务到达时,任务可以不需要等到线程穿件就能立即执行

提高线程的可管理性:线程时稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控

实现原理:

当向线程池提交一个任务后:

1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程

2)线程池判断工作队列是否已经存满。如果没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程

3)线程池判断线程池的线程(最大线程数量)是否都处于工作状态。如果没有则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略处理

参数说明:

corePoolSize:线程池的大小。当提交一个任务到线程池时才会创建线程,即使其他线程空闲也会创建,当需要执行的任务大于该值时则停止新建操作。

maximumPoolSize:线程池中允许创建的最大线程数;

runnableTaskQueue:任务队列,用来存储等待执行的任务,分别为:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue(尽可能使用有界队列,无界队列会存在内存溢出风险)

threadFactory:线程工厂,是用来设置创建线程的工厂。实现ThreadFactory接口即可

rejectedExecutionHandler:饱和策略。当线程池和队列都满了,新任务采取饱和策略,有以下取值:
          AbortPolicy:抛出异常。 
          DiscardPolicy:丢弃任务,但是不抛出异常。 
          DiscardOldestPolicy:丢弃队列最前面的任务,并执行当前任务
          CallerRunsPolicy:由调用线程处理该任务

keepAliveTime:空闲线程存活时间。默认情况下,该值在线程数大于corePoolSize时,对超出corePoolSize值得这些线程起作用。

TimeUnit:空闲线程存活时间的单位,可选单位有天(DAYS)、小时(HOURS)、分钟(MINUTES)、秒(SECONDS)

提交任务:

向线程池提交任务调用execute()或submit()方法即可

execute():没有返回值,入参必须是一个实现Runnable接口的实例

submit():有返回值,返回一个future类型的对象调用get()方法获取返回值,入参必须是一个实现Callable接口的实例

ScheduledThreadPoolExecutor:

ScheduledThreadPoolExecutor可以用来在给定延时后执行异步任务或者周期性执行任务,使用无界队列(DelayQueue),所以设置maximumPoolSize的大小没什么效果,当调用scheduleAtFixedRate()和scheduleWithFixedDelay()方法时向队列中添加任务,线程池中的线程从队列中获取任务,然后执行

Spring中的定时任务使用ScheduledThreadPoolExecutor实现,并且线程池中只有一个线程,只有一个,只有一个!

 

Java线程池的参数包括以下7个: 1. corePoolSize:线程池的基本大小,即在没有任务需要执行的时候线程池的大小。 2. maximumPoolSize:线程池最大的大小,即线程池中允许的最大线程数。 3. keepAliveTime:线程池中的线程空闲后,保持存活的时间。 4. unit:keepAliveTime的时间单位。 5. workQueue:任务队列,用于保存等待执行的任务的阻塞队列。 6. threadFactory:线程工厂,用于创建新线程。 7. handler:拒绝策略,用于当任务队列已满,且线程池中的线程数达到maximumPoolSize时,如何拒绝新任务的策略。 下面是一个示例代码,展示了如何使用Java中的线程池参数: ```java import java.util.concurrent.*; public class ThreadPoolDemo { public static void main(String[] args) { // 创建一个线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, // corePoolSize 4, // maximumPoolSize 60, // keepAliveTime TimeUnit.SECONDS, // unit new ArrayBlockingQueue<Runnable>(4), // workQueue Executors.defaultThreadFactory(), // threadFactory new ThreadPoolExecutor.AbortPolicy() // handler ); // 提交任务 for (int i = 0; i < 10; i++) { executor.execute(new Task(i)); } // 关闭线程池 executor.shutdown(); } static class Task implements Runnable { private int num; public Task(int num) { this.num = num; } @Override public void run() { System.out.println("正在执行task " + num); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task " + num + "执行完毕"); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值