(资料图)
二、Java开启异步的两种方式
1、注解开启:@Async
1.1、配置异步的线程池
- 必须配置异步线程池,否则异步不会生效。
- @EnableAsync 注解:指定异步线程池。不指定默认使用:SimpleAsyncTaskExecutor线程池
- SimpleAsyncTaskExecutor是一个最简单的线程池,它没有任何的线程相关参数配置,它会为每个任务创建一个新的线程来执行,因此不建议在生产环境中使用。
- 配置线程池见:https://www.cnblogs.com/kakarotto-chen/p/17428432.html
package com.cc.md.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;/** IO型的线程池 * @author CC * @since 2023/5/23 0023 */@Configuration@EnableAsyncpublic class IoThreadPool { public static final int THREAD_SIZE = 2 * (Runtime.getRuntime().availableProcessors()); public static final int QUEUE_SIZE = 1000; @Bean(name = "myIoThreadPool") public ThreadPoolTaskExecutor threadPoolExecutor(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(THREAD_SIZE); executor.setMaxPoolSize(THREAD_SIZE); executor.setQueueCapacity(QUEUE_SIZE); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); executor.setKeepAliveSeconds(60); executor.setAllowCoreThreadTimeOut(true); executor.setAwaitTerminationSeconds(300); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setThreadNamePrefix("myIo-Th-Pool-"); executor.initialize(); return executor; }}1.2、异步方法
- 异步方法必须写在另一个类中,否则不生效
- @Async可以打在类上、也可以打在方法上
1 @Async:类上,说明整个类中的方法都是异步。必须写我们自己配置的线程池 —— ("myIoThreadPool") 2 @Async:方法上,说明这个方法是异步。不用写我们自己配置的线程池- 异步接口+实现类
接口
package com.cc.md.service;/** * @author CC * @since 2023/5/24 0024 */public interface IAsyncService { /** 异步方法1 * @since 2023/5/24 0024 * @author CC **/ void async1(); /** 异步方法2 * @since 2023/5/24 0024 * @author CC **/ void async2();}实现类
package com.cc.md.service.impl;import com.cc.md.service.IAsyncService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;/** 1 @Async:类上,说明整个类中的方法都是异步。必须写我们自己配置的线程池 —— ("myIoThreadPool") * 2 @Async:方法上,说明这个方法是异步。不用写我们自己配置的线程池 * @author CC * @since 2023/5/24 0024 */@Service@Async("myIoThreadPool")public class AsyncServiceImpl implements IAsyncService { private static final Logger log = LoggerFactory.getLogger(AsyncServiceImpl.class); //类上写了@Async,这里就可以不写了。 //可以不写 ("myIoThreadPool")。因为在IoThreadPool中开启了异步,说明异步用的就是我们配置的io线程池 //如果类上面打了 @Async ,这里必须写:("myIoThreadPool") @Override //@Async public void async1(){ //模仿io流耗时 try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } log.info("打印:{}", "异步方法1111!"); } //@Async在类上面,说明这个方法也是异步方法。如果不打,无法开启异步。 @Override public void async2(){ //模仿io流耗时 try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } log.info("打印:{}", "异步方法2222!"); }}1.3、测试
@Resource private IAsyncService asyncService; //开启异步1 —— @Async @Test public void test03() throws Exception { log.info("打印:{}", "异步测试的-主方法1"); asyncService.async1(); asyncService.async2(); //不会等待异步方法执行,直接返回前端数据 log.info("打印:{}", "异步测试的-主方法2"); }结果:
2、CompletableFuture的方式
使用:
@Resource(name = "myIoThreadPool") private ThreadPoolTaskExecutor myIoThreadPool; //开启异步2 —— CompletableFuture.runAsync() @Test public void test04() throws Exception { log.info("打印:{}", "异步测试的-主方法1"); CompletableFuture.runAsync(() -> { log.info("打印:{}", "异步方法1!"); //异步执行的代码,也可以是方法,该方法不用单独写到其他类中。 this.async2("异步方法1!-end"); }, myIoThreadPool); //不会等待异步方法执行,直接返回前端数据 log.info("打印:{}", "异步测试的-主方法2"); } //异步需要执行的方法,可以写在同一个类中。 private void async2(String msg) { //模仿io流耗时 try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } log.info("打印:{}", msg); }结果:
- 后续CompletableFuture的使用见:《Java的CompletableFuture,Java的多线程开发》
关键词:
二、Java开启异步的两种方式 1、注解开启:==@Async== 1 1、配置异步的线程池-必须配置异步线程池,否2023-05-24
按照《劳动合同法》第八十二条规定,用人单位自用工之日起超过一个月不满一年未与劳动者订立书面劳动合同的2023-05-24
兰州市城市生活垃圾分类宣教中心正式启动运营,垃圾分类,兰州市,生活垃圾,垃圾回收2023-05-24
1、两条平行线之间的距离(相等)。本文就为大家分享到这里,希望小伙伴们会喜欢。2023-05-24
1、呵,没试过,应该只能在EXCEL里面改哦!。本文到此分享完毕,希望对你有所帮助。2023-05-24
从这几年的实践当中,我们深切体会到四川动力电池产业之所以能得到强劲发展,既是政府的有为推动,也是市场2023-05-24
原标题:“AI孙燕姿”爆火,恰恰印证优质歌手的无可取代黄启哲不出意外的话,“AI孙燕姿”将成为本年度发歌2023-05-24
两部门:5月1日-10月31日免征国家电影事业发展专项资金中新网5月23日电据国家电影局网站23日消息,财政部、2023-05-24
2023四川养老金调整时间及方案?退休人员2023年工资有多少?今年退休养老金将如何涨的?依据是什么?今日会2023-05-24
美元指数:美元指数昨日保持强势,延续反弹向上,回撤几乎没有,整体走100 8的双支撑反弹向上走势;虽然当2023-05-24
近日,市民王女士致电96339热线反映,田安大桥泉州市区段的桥面两侧长了很多杂草,垃圾满地,影响市容市貌2023-05-24
【女商人伙同情夫枪杀亲夫被执行死刑】近日,一段成都中院公布的死刑执行案件信息,因涉及合伙杀夫情节而引2023-05-24
1、你要是正版的凯立德地图的话,是需要花钱买的。2、免费的凯立德地图都是破解版的,如果是破解版的,可以2023-05-24
投资者等待OPEC+6月份会议,沙特能源部长警告交易员不要押注油价持续下跌,欧美原油期货在美国夏季驾车高峰2023-05-24
翔腾新材发布首次公开发行股票网上申购摇号中签结果。投资者根据网上中签结果公告确认中签后足额缴纳认购款2023-05-24
一季度全省接待游客608 27万人次同比增长22 5%实现旅游总收入55 72亿元同比增长15 1%西宁市24家重点景区接2023-05-24
八村塁:我喜欢和詹眉打球我会和经纪人讨论并做出最好决定,湖人,詹眉,八村塁,八村垒,日本篮球,美国篮球,勒2023-05-24
近日,3月21日,广西桂林,随着寒潮、强对流天气的强势来袭,临桂区出现17级大风,当地气象局发布大风红色2023-05-24
这是2023款宾利飞驰Speed,这是一款拥有12缸引擎的手工打造的超豪华轿车,可与劳斯莱斯古思特和梅赛德斯-迈2023-05-24
2023年吉林函授学历的用途有哪些(须知)2023年吉林函授学历的用途有哪些(须知)随着社会的发展,越来越多2023-05-24
解答:1、平静的高考,一切顺利!2、手要稳,尽力而为。3、为了避免弱点,一个人必须成功。4、高考决战,将2023-05-24
今天来聊聊关于男主老婆多的修仙小说,男主老婆多的都市小说的文章,现在就为大家来简单介绍下男主老婆多的2023-05-24
5月23日,全国近百家来自中央新闻网站和省、市级重点新闻网站的记者齐聚重庆,共同参与“拥抱新时代奋进新2023-05-24
1、呵呵,没回音应该也算很正常了。2、编辑是有限的几个,投稿量是很多很多,越热的地方越多,编辑不可能给2023-05-24
上证报中国证券网讯据工业和信息化部5月23日消息,为推动京津冀产业协同发展迈上新台阶,服务构建新发展格2023-05-24
