SpringBoot多线程的实现

1. 多线程

在我们的系统中,经常会处理一些耗时任务,就会想到使用多线程,JDK给我们提供了非常方便的操作线程的API,为什么还要使用Spring来实现多线程呢?
在Springboot中,针对多线程以及线程池,提供了 @EnableAsync 以及 @Async 两个注解

// 启用异步任务
@EnableAsync  
 
// 可以使用在类或方法上,这里进行标注为异步任务,在执行时,会单独开启线程来执行(指定线程池的名字)
@Async("XXXX")

2.springBoot中配置多线程,线程池

Spring中实现多线程,只需要在配置类中添加 @EnableAsync就可以使用多线程。在希望执行的并发任务的方法中使用 @Async 就可以定义一个线程任务。通过spring给我们提供的ThreadPoolTaskExecutor 就可以使用线程池。

@EnableAsync // 启用异步任务
@Configuration
public class ThreadConfig {

    /**
     * 配置线程池
     */
    // 声明一个线程池(并指定线程池的名字)
    @Bean("taskExecutor")
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        // 最小线程数量
        poolTaskExecutor.setCorePoolSize(3);
        // 最大线程数据量
        poolTaskExecutor.setMaxPoolSize(1024);
        // 等待队列
        poolTaskExecutor.setQueueCapacity(256);
        // 初始化
        poolTaskExecutor.initialize();
        //允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        poolTaskExecutor.setKeepAliveSeconds(60);
        return poolTaskExecutor;
    }
}

配置完成之后紧接着使用多线程

3.springBoot使用线程池

只需要在@Async注解中指定线程池名即可,比如:

@Service
public class HandBrakeService {

    @Async("taskExecutor")
    public void transCoding(String link, String linkName) throws Exception{

        // 读取RTSP视频资源
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(link);
        // 设置分辨率宽度
        int captureWidth = 1280;
        grabber.setImageWidth(captureWidth);
        // 设置分辨率高度
        int captureHeight = 720;
        grabber.setImageHeight(captureHeight);
        // rtsp格式一般添加TCP配置,否则丢帧会比较严重
        grabber.setOption("rtsp_transport", "tcp");
        grabber.start();
        ......

接下来运行自己的代码就可以看到效果了

你可能感兴趣的:(java)