springboot nio 线程池_java线程池的使用例子

(1) 2024-07-02 18:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
springboot nio 线程池_java线程池的使用例子,希望能够帮助你!!!。

Springboot线程池配置管理

1. 线程池配置类
package com.bin.kong.csdnspider.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor; @Configuration @EnableAsync public class ThreadPoolConfig { private int corePoolSize = 10;//线程池维护线程的最少数量 private int maxPoolSize = 50;//线程池维护线程的最大数量 private int queueCapacity = 20; //缓存队列 private int keepAlive = 120;//允许的空闲时间 @Bean public AsyncTaskExecutor threadExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); executor.setThreadNamePrefix("threadExecutor-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略 executor.setKeepAliveSeconds(keepAlive); executor.initialize(); return executor; } } 

配置说明:

配置项 说明
corePoolSize 最小的线程数,缺省:1
maxPoolSize 最大的线程数,缺省:Integer.MAX_VALUE
queueCapacity 当线程池中最小的线程数被占用满后,新的任务会被放进队列queue里面,当这个queue的capacity也被占满之后,pool里面会创建新线程处理这个任务,直到总线程数达到了最大线程数maxsize,这时系统会拒绝这个任务并抛出TaskRejectedException异常(缺省配置的情况下,可以通过rejection-policy来决定如何处理这种情况)。缺省值为:Integer.MAX_VALUE
keepAlive 超过corePoolSize最小线程数的那些线程,任务完成后,再经过这个设置的时长(单位:秒)会被结束掉,这样的话线程池可以动态的调整池中的线程数
rejection-policy ABORT(缺省):抛出TaskRejectedException异常,然后不执行;DISCARD:不执行,也不抛出异常即放弃该线程;DISCARD_OLDEST:丢弃queue中最旧的那个任务;CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行(不再异步)
2.线程池的使用

在类中的方法名上使用:@Async(“threadExecutor”) 即可达到使用线程池的效果
示例如下:

package com.bin.kong.csdnspider.utils; import org.springframework.scheduling.annotation.Async; @Service public class TestThreadPool { @Async("threadExecutor") public void exec() { System.out.println("当前线程名:"+Thread.currentThread().getName()); } } 

测试打印结果如下:

当前线程名:threadExecutor-1

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复