一 案例场景
一般的下单流程如下图,先判断用户有没有资格/商品的库存,之后创造订单,然后处理下一次下单请求,这不利于高并发场景,我们把一部分处理流程分离出来,交给其他子线程处理,主线程处理是否符合要求即可。
二代码实现
//阻塞队列: 当队列没有数据时进行阻塞,add添加数据
// 缺点:超出内存大小,出现溢出 数据不安全
private static ArrayBlockingQueue<VoucherOrder> abq = new ArrayBlockingQueue<>(1024 * 1024);
//线程池
private static ExecutorService Thread = Executors.newSingleThreadExecutor();
//此注解作用:当前类初始化完毕之后自动执行该方法
@PostConstruct
private void ioin() {
Thread.submit(new a());
}
//用来执行请求
private class a implements Runnable {
@Override
public void run() {
//为什么为turn?,因为不是执行一次就结束,因为是阻塞队列的特点
while (true) {
try {
//通过take获取对象,自然是第一个了
VoucherOrder take = abq.take();
// 逻辑:往数据库里新建订单和redis 插入已下单用户id
System.out.println(" __" );
} catch (InterruptedException e) {
System.err.println("阻塞队列异常");
}
}
}
}
// 创造订单
public void addOrder() {
VoucherOrder v = new VoucherOrder();
abq.add(v);
}