SpringBoot 并发编程学习历程( 二 )

在重复一次-.- , 为什么需要这么一个类呢,因为我们之前说过要实现主线程和副线程分离,所以需要一个中介来存放处理信息(比如:这个订单号信息 , 和处理结果信息),一个订单肯定要对应一个结果 。不然岂不是乱了套 。
DeferredResult是用来放处理结果的对象 。
好了,那新问题又来了 , 我们怎么去判断订单处理成功了没有 , 我们此时就需要写一个监听器,过100毫秒监听一次MockQueue类中的completeOrder中是否有值,如果有值,那么这个订单就需要被处理 。我们写一个监听器 。
【SpringBoot 并发编程学习历程】######QueueListener .java:
/** * Queue监听器 * Created by Fant.J. */@Component@Slf4jpublic class QueueListener implements ApplicationListener<ContextRefreshedEvent>{@Autowiredprivate MockQueue mockQueue;@Autowiredprivate DeferredResultHolder deferredResultHolder;@Overridepublic void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {new Thread(()->{while(true){//判断CompleteOrder字段是否是空if (StringUtils.isNotBlank(mockQueue.getCompleteOrder())){String orderNumber = mockQueue.getCompleteOrder();deferredResultHolder.getMap().get(orderNumber).setResult("place order success");log.info("返回订单处理结果");//将CompleteOrder设为空,表示处理成功mockQueue.setCompleteOrder(null);}else {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}}

SpringBoot 并发编程学习历程

文章插图
我们可以看到一共有三个不同的线程来处理 。
SpringBoot 并发编程学习历程

文章插图
分割线后,我再给大家带来一批干货,自定义线程池https://www.jianshu.com/p/832f2b162450 。
学完这个后 , 再看下面的 。
我们前面的代码中,有两部分有用new Thread()来创建线程 , 我们有自己的线程池后,就可以用线程池来分配线程任务了,我在自定义线程里有讲 , 我用的是第二种配置方法(用@Async注解来给线程 ) 。
修改如下:
@Asyncpublic void setPlaceOrder(String placeOrder) throws InterruptedException {log.info("接到下单请求"+placeOrder);//模拟处理try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//给completeOrder赋值this.completeOrder = placeOrder;log.info("下单请求处理完毕"+placeOrder);}我们看看效果:
SpringBoot 并发编程学习历程

文章插图
圈红圈的就是我们自己定义的线程池里分配的线程 。




推荐阅读