您现在的位置是:首页 > 正文

【SpringBoot】线程池自定义配置

2024-01-30 23:35:36阅读 1

方法

1、创建配置类

@Configuration
@EnableAsync
@Component
public class ThreadPoolConfigTest {

    @Bean(name = "asyncExecutor")
    public Executor getThreadPool() {
        //cpu的核心数,包括超线程出来的cpu核心数
        int num = Runtime.getRuntime().availableProcessors();

        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();

        taskExecutor.setCorePoolSize(num);
        taskExecutor.setMaxPoolSize(num * 5);

        //阻塞队列任务
        taskExecutor.setQueueCapacity(num * 2);

        //线程名的前缀
        taskExecutor.setThreadNamePrefix("taskExecutor->");

        //初始化线程池
        taskExecutor.initialize();

        return taskExecutor;
    }
}

2、使用方式

方式一、通过注解方式使用线程池

创建线程任务

@Component
public class ThreadTasks {
    @Async
    public void startMyThreadTask(int i) throws InterruptedException {
        Thread.sleep(1000);
        System.out.println(Thread.currentThread().getName() + ": " + i);
        System.out.println("startMyThreadTask: " + i);
    }
}

调用

@RestController
@RequestMapping("/thread")
public class ThreadController {
    @Resource
    private ThreadTasks threadTasks;
    @Resource
    private TestService testService;

    @GetMapping("test1")
    public void test1() throws InterruptedException {
        System.out.println("test1获取主线程名称: " + Thread.currentThread().getName());

        for (int i = 0; i < 10; i++) {
            threadTasks.startMyThreadTask(i);
        }

        System.out.println("test1执行任务完成了");
    }
方式二、通过submit使用

定义Service

@Service
public class TestService {
    @Resource
    private ThreadPoolTaskExecutor asyncExecutor;

    public void test() {
        System.out.println(Thread.currentThread().getName());

        asyncExecutor.submit(() -> {
            System.out.println(Thread.currentThread().getName());
            System.out.println("娃哈哈哈哈哈");
        });
    }
}

使用Service

@RestController
@RequestMapping("/thread")
public class ThreadController {
    @Resource
    private ThreadTasks threadTasks;
    @Resource
    private TestService testService;

    @GetMapping("test2")
    public void test2() {
        testService.test();
    }
}

额外提示

  • SpringBoot默认是有线程池的,如果不想自己定义。可以直接在SpringBoot的启动类上加上@EnableAsync,即可通过注解的方式使用默认的线程池。
    在这里插入图片描述
  • 由于SpringBoot默认有线程池,所以也可以用直接调用ThreadPoolTaskExecutor的方式使用线程池。

实例代码

@SpringBootTest
class ThreadPoolApplicationTests {
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    AsyncTest asyncTest;
    @Autowired
    ThreadPoolTaskExecutor threadPoolTaskExecutor;
    @Test
    void contextLoads() throws InterruptedException {
        asyncTest.hello("async注解创建");
        threadPoolTaskExecutor.submit(new Thread(()->{
            logger.info("threadPoolTaskExecutor 创建线程");
        }));
        //一定要休眠 不然主线程关闭了,子线程还没有启动
        Thread.sleep(1000);
    }
}

参考链接: 线程池配置及@Async异步注解

网站文章

  • sql常用crud命令

    创建表CREATE TABLE student( sno VARCHAR(8), sname VARCHAR(14), sex char(4) check(sex='男' or sex='女')...

    2024-01-30 23:35:19
  • 12306抢票系统详解

    12306抢票系统详解

    12306 抢票,极限并发带来的思考: 虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会。 尤其是春节期间,大家不仅使用 12306,还会考虑“智行”和其他的抢票软件,全国...

    2024-01-30 23:34:48
  • 精选目标检测3——yolo1、yolo2、yolo3和SSD的网络结构汇总对比

    精选目标检测3——yolo1、yolo2、yolo3和SSD的网络结构汇总对比

    学习前言各个网络的结构图与其实现代码 1、yolo1 2、yolo2 3、yolo3 4、SSD总结学习前言……最近在学习yolo1、yolo2和yolo3,事实上它们和SSD...

    2024-01-30 23:34:32
  • 完美的解决IE6下fixed定位抖动问题

     body{_position:absolute; _top:expression(offsetParent.scrollTop);}#sidenav { width: 300px; position: fixed; /*--Fix the sidenav to stay in one spot--*/ float: left; /*--Keeps sid...

    2024-01-30 23:34:25
  • 学生必看!免费领取一台阿里云服务器

    学生必看!免费领取一台阿里云服务器

    阿里云学生服务器优惠活动:高效计划,可以免费领取一台阿里云服务器,如果你是一名高校学生,想搭建一个linux学习环境、git代码托管服务器,或者创建个人博客网站记录自己的学习成长历程,拥有一台云服务器是很有必要的。阿里云的飞天加速计划3.0——高校计划,面向学生开发者提供免费的云服务器福利,通过学生身份认证及续费任务后,最多可领取7个月免费云服务器ECS资源

    2024-01-30 23:34:18
  • Dom4j解析xml格式字符串

    xml字符串&lt;Response service="OrderWebService"&gt; &lt;Head&gt;OK&lt;/Head&gt; &lt;Body&gt; &lt;OrderResponse&gt; &lt;customerOrderNo&gt;201605110015&lt;/customerOrd

    2024-01-30 23:33:47
  • Java学习之随机生成10个1000-2000的整数,将它们写到一个文件data.dat中,然后从该文件中读出这些整数,要求使用DataInputStream和DataOutputStream类实现。

    Java学习之随机生成10个1000-2000的整数,将它们写到一个文件data.dat中,然后从该文件中读出这些整数,要求使用DataInputStream和DataOutputStream类实现。

    案例介绍: 编写程序,随机生成10个1000-2000的整数,将它们写到一个文件data.dat中,然后从该文件中读出这些整数,要求使用DataInputStream和DataOutputStream...

    2024-01-30 23:33:40
  • c++17 launder

    c++17 launder代码代码#include <new>#include <cstddef>#include <cassert>#include <iostream>struct X { ...

    2024-01-30 23:33:32
  • 想要成为顶尖级工程师,先从这三大境界开始!

    想要成为顶尖级工程师,先从这三大境界开始!

    三大境界,想起了王国维广为流传的三句话:昨夜西风凋碧树,独上高楼,望尽天涯路,此第一境也;衣带渐宽终不悔,为伊消得人憔悴,此第二境也;众里寻他千百度,蓦然回首,那人却在灯...

    2024-01-30 23:33:02
  • 学习ES6(十):Promise的语法糖await和async

    文章目录一、await和async特点二、使用方法使用async定义异步处理函数async配合Promise使用三、总结 一、await和async 在ES2017中,引入了async函数,来方便异步...

    2024-01-30 23:32:56