赞
踩
在我们的系统中,经常会处理一些耗时任务,就会想到使用多线程,JDK给我们提供了非常方便的操作线程的API,为什么还要使用Spring来实现多线程呢?
在Springboot中,针对多线程以及线程池,提供了 @EnableAsync 以及 @Async 两个注解
// 启用异步任务
@EnableAsync
// 可以使用在类或方法上,这里进行标注为异步任务,在执行时,会单独开启线程来执行(指定线程池的名字)
@Async("XXXX")
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; } }
配置完成之后紧接着使用多线程
只需要在@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(); ......
接下来运行自己的代码就可以看到效果了
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。