springboot是啥SpringBoot环境下的多线程开发案例
讲实话以前没有写过多线程编程,这次也是参考了⽹上其他的案例总结了⼀下,并且投⾝到京东那边的实际项⽬⾥尝试了⼀下,下⾯说⼀下实际案例。
SpringBoot内其实多线程⼀般还是⾛线程池,因为线程池好控制,内部也有⼀定控制,拒绝策略等等,还可以最⼤程度发挥线程的特性,发挥cpu的性能。
先说⼀下,我们在线程池Executor这边的配置类
这都是基本的配置类,⽹上随便就能抄到的。
@Configuration
@EnableAsync
public class ExecutorConfig {
private static final Logger logger = Logger(ExecutorConfig.class);
@Bean
public Executor asyncServiceExecutor(){
logger.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor =new VisiableThreadPoolTaskExecutor();
//配置核⼼线程数
executor.setCorePoolSize(5);
//配置最⼤线程数
executor.setMaxPoolSize(5);
//配置队列⼤⼩
executor.setQueueCapacity(99999);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-service-");
/
/ rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执⾏任务,⽽是有调⽤者所在的线程来执⾏
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执⾏初始化
executor.initialize();
return executor;
}
}
⼀般情况下我们在学多线程的时候,都是Thread的匿名内部类写法和Runnable的重写run⽅法,但是在springboot中,为我们直接定义好了这相关操作,只需要annotation就可以了。
要知道,我们实际上去使⽤了多线程,达到的还是⼀种异步的操作,所以不多说了,上代码。
常规定义⼀个接⼝:
常规的去实现,在这⾥⽹上资料都会告诉你在Service层,接⼝的实现⽅法上扔⼀个@Async(< beanname >)
像这样:
因为是公司代码,就不多展⽰了,意思就是这个意思。@Async上参数写⼀个刚才配置类⾥⾯定义线程池参数的⽅法名。
然后控制层再引⽤⼀下跑,⼀般⽹上csdn的博客都这么说,⽇志还打印的不错,实际上postman⼀测试,啥东西也没有,就这样的:
没错,其实的确是执⾏了多线程,看了⽹上资料的话,也能感受到,但是异步执⾏的时候,这种⽅法,也就是Thread和Runnable多线程开发的这种⽅法,是没办法获取返回值的。
背了⾯试题的各位应该知道Callable接⼝可以返回线程中的返回值,我梳理⼀下它们之间的关系。
Runnable和Callable都可以进⾏多线程开发,Executor接⼝创建的线程池,是调度他们俩的容器,如果我们想要具体的获取值,是可以通过Future来实现的,但是,区别就在于Runnable使⽤了Future还是不能得到返回值,⽽Callable是可以的。
这⾥可以去看⼀下FutureTask的源码,⾥⾯是有Callable的,这⾥就不展开了。
⾔归正传,我们要是想获取返回值,就要通过Future来实现。
也就是说,我们最后返回⼀个Future对象给控制层,然后控制层这样:
就可以得到返回值了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。