博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot + 线程池的简单使用
阅读量:3934 次
发布时间:2019-05-23

本文共 3192 字,大约阅读时间需要 10 分钟。

SpringBoot是一款很强大的框架

  1. 我们先配置核心线程池核心文件
@Configuration@EnableAsyncpublic class BeanConfig {
@Bean public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 设置核心线程数 executor.setCorePoolSize(3); // 设置最大线程数 executor.setMaxPoolSize(5); // 设置队列容量 executor.setQueueCapacity(10); // 设置线程活跃时间(秒) executor.setKeepAliveSeconds(60); // 设置默认线程名称 executor.setThreadNamePrefix("hello-"); // 设置拒绝策略 executor.setRejectedExecutionHandler(new BeanConfig.MyIgnorePolicy()); System.out.println("当前核心线程数:" + executor.getCorePoolSize()); System.out.println("当前线程池最大线程数:"+ executor.getMaxPoolSize()); System.out.println("获取线程池数:" + executor.getPoolSize()); System.out.println("线程名称:"+ executor.getThreadNamePrefix()); // 等待所有任务结束后再关闭线程池 executor.setWaitForTasksToCompleteOnShutdown(true); return executor; } /** * 线程拒绝策略 */ public static class MyIgnorePolicy implements RejectedExecutionHandler {
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
doLog(r, e); } private void doLog(Runnable r, ThreadPoolExecutor e) {
// 可做日志记录等 System.err.println("这个线程被拒绝了:" + r.toString() );// System.out.println("completedTaskCount: " + e.getCompletedTaskCount()); } }}

ThreadPoolExecutorThreadPoolTaskExecutor里面的一些参数配置大体相同(本人是先学习使用ThreadPoolExecutor使用线程池的),[参数配置详情见 菜菜聊架构]这篇博客还不错(https://www.cnblogs.com/caicz/p/10930461.html)

)
这里你也可以自定义拒绝策略
坑边闲话:这里我们使用的是ThreadPoolTaskExecutor来创建线程,在下一篇我会使用ThreadPoolExecutor创建线程,就目前根据阿里规范而言我们是不推荐使用newCachedThreadPool创建一个可缓存线程池、newFixedThreadPool创建一个定长线程池、newScheduledThreadPool创建一个定长线程池、newSingleThreadExecutor创建一个单线程化的线程池这四种方式创建线程的

2 . 配置完成线程池后我们就可以开始使用线程池了

我们先编写控制层

@RestController@RequestMapping("/threadController")public class ThreadController {
@Autowired private AsyncService asyncService; @GetMapping("/testThread") public String testThread() {
//调用service层的任务 asyncService.executeAsync(); return "执行开始"; }}

编写业务层接口类

public interface AsyncService {
/** * 调用线程池 **/ void executeAsync();}

最后编写业务层接口实现类

@Servicepublic class AsyncServiceImpl implements AsyncService {
private static final Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class); /** * 这里必须使用@Async注解否者你就没有调用线程池里的线程 * 在@Async("")中里面需要填写在核心配置里面的方法名(即添加了@Bean注解的方法名且一致) **/ @Async("taskExecutor") @Override public void executeAsync() {
logger.info("开始线程任务"); try {
//这里编写循环是为了测试当前线程池,当线程池达到最大容量时线程池会调用拒绝策略 int num = 100; for (int i=1;i<=num;i++){
System.out.println("!!!!当前运行的线程名称:" + Thread.currentThread().getName()); Thread.sleep(3000L); System.out.println("当前次数:" + i); } } catch (Exception e) {
e.printStackTrace(); } logger.info("结束线程任务"); }}

根据自己的需求可以自定义配置线程池大小,拒绝策略等配置

至此SpringBoot简单使用线程池就写完了,如有不懂可以加SpringBoot技术交流群14群号:719099151我是小吾,有问题可以直接在群里@我

你可能感兴趣的文章
学习资料
查看>>
技术 +市场必须两手抓
查看>>
服务器抓包
查看>>
vim应用
查看>>
SOA性能管理现状
查看>>
Linux服务器常用命令
查看>>
Linux 检索
查看>>
防止机器注册
查看>>
git操作杂记
查看>>
thrift应用
查看>>
php 按元素值获取最佳元素组合
查看>>
支付服务集成-支付宝
查看>>
使用openssl生成RSA公钥和私钥对
查看>>
Linux常用命令
查看>>
Linux 定时任务应用
查看>>
什么是线程安全
查看>>
第三方支付集成
查看>>
MySQL server has gone away 问题的解决方法
查看>>
常用链接
查看>>
Easyui Pagenation应用方法
查看>>