Springboot中线程池的使用与应用

1、线程池的类型

1:Executors.newSingleThreadExecutor()
corePoolSize和maximumPoolSize都为1,也就是创建了一个固定大小是1的线程池,workQueue是new LinkedBlockingQueue < Runnable >()是一种无界阻塞队列,队列的大小是Integer.MAX_VALUE,可以认为是队列的大小不限制。
由此可以得出通过该方法创建的线程池,每次只能同时运行一个线程,当有多个任务同时提交时,那也要一个一个排队执行

2:Executors.newFixedThreadPool(int nThreads)
创建了一个固定大小的线程池,可以指定同时运行的线程数量为nThreads。
3:Executors.newCachedThreadPool()
构造一个缓冲功能的线程池,配置corePoolSize=0,maximumPoolSize=Integer.MAX_VALUE,keepAliveTime=60s,以及一个无容量的阻塞队列 SynchronousQueue,因此任务提交之后,将会创建新的线程执行;线程空闲超过60s将会销毁
4:Executors.newScheduledThreadPool(int corePoolSize)
构造有定时功能的线程池,配置corePoolSize,无界延迟阻塞队列DelayedWorkQueue;maximumPoolSize=Integer.MAX_VALUE,由于DelayedWorkQueue是无界队列,所以这个值是没有意义的

2、TaskExecutor接口的实现类简要说明

1:SimpleAsyncTaskExecutor类 :这个实现不重用任何线程,或者说它每次调用都启动一个新线程,性能消耗比较严重。

2:ConcurrentTaskExecutor 类 :Spring 2.x借助ConcurrentTaskExecutor和ThreadPoolTaskExecutor能够通过IoC配置形式自定义它们暴露的各个属性。很少需要使用ConcurrentTaskExecutor,有另一个备选, ThreadPoolTaskExecutor类

3:ThreadPoolTaskExecutor 类 :ThreadPoolTaskExecutor内部对ThreadPoolExecutor进行了包装,同时提供能够通过IOC的形式来配置线程池的各个参数,比较常用

4:ThreadPoolTaskScheduler类 :ThreadPoolTaskScheduler内部对ScheduledThreadPoolExecutor进行了包装,除了能执行异步任务外支持定时/延迟任务的执行,属于一种高级特性

3、自定义ThreadPoolTaskExecutor

1)配置

@Configuration

 @Bean
    public ThreadPoolTaskExecutor mythreadpool(){
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
        //设置核心线程数
        threadPool.setCorePoolSize(5);
        //设置最大线程数
        threadPool.setMaxPoolSize(100);
        //设置线程超时等待时间
        threadPool.setKeepAliveSeconds(60);
        //设置任务等待队列的大小
        threadPool.setQueueCapacity(100);
        //设置线程池内线程的名称前缀---阿里编码规约推荐----出错了方便调试
        threadPool.setThreadNamePrefix("myThreadPool-");
        //设置任务拒绝策略
        threadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        //直接初始化
        threadPool.initialize();
        return threadPool;
    }
2)使用
// @Autowired
@Resource(name = "mythreadpool")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
可以使用Spring Boot提供的ThreadPoolTaskExecutor来创建线程池。 首先,在你的Spring Boot应用程序创建一个配置类,如下所示: ```java @Configuration public class ThreadPoolConfig { @Bean public ThreadPoolTaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(20); executor.setQueueCapacity(30); executor.setThreadNamePrefix("ThreadPoolTaskExecutor-"); executor.initialize(); return executor; } } ``` 在上面的代码,我们创建了一个ThreadPoolTaskExecutor实例,并配置了一些属性: - corePoolSize:线程池的核心线程数。 - maxPoolSize:线程池的最大线程数。 - queueCapacity:线程池的队列容量。 - threadNamePrefix:线程池线程的名称前缀。 然后,我们可以在Spring Boot应用程序使用@Autowired来注入ThreadPoolTaskExecutor实例,然后调用submit()方法来提交任务,如下所示: ```java @Service public class MyService { @Autowired private ThreadPoolTaskExecutor executor; public void doSomethingAsync() { executor.submit(() -> { // 执行异步任务 }); } } ``` 在上面的代码,我们注入了ThreadPoolTaskExecutor实例,并使用submit()方法提交了一个异步任务。 注意,当我们使用线程池处理异步任务时,我们需要非常小心地处理线程池的异常,否则可能会导致应用程序崩溃。因此,我们建议在异步任务使用try-catch块来捕获异常,并将异常记录到日志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值