单服务高效处理程序For循环
倍数提升for循环执行速度
无法避免的循环
需要对全部订单进行处理后处理其他业务逻辑
// 获取全部数据
Set<String> orderNoSet = selectAll();
for (String orderNo : orderSet){
// 业务逻辑
Sysrtem.out.println(orderNo);
}
// 全部执行后执行的业务逻辑
Sysrtem.out.println("全部执行完成");
技术方案
采用多线程+信号量+BlockingQueue队列批处理订单
1,多线程分摊主线程压力,提高效率;
2,信号量确保全部执行完成后进行后续逻辑;
3,BlockingQueue队列来分配任务,每个线程从队列中取订单进行处理,防止多线程获取订单冲突;
// 获取全部数据
Set<String> orderNoSet = selectAll();
// 获取最小订单量,防止多开线程
int min = Math.min(5, orderNoSet.size());
// 线程池,固定大小为5个线程
ExecutorService executor = Executors.newFixedThreadPool(min);
// 使用BlockingQueue来分配任务,每个线程从队列中取订单进行处理
BlockingQueue<String> queue = new ArrayBlockingQueue<>(orderNoSet.size());
// 将所有订单加入到队列
queue.addAll(orderNoSet);
// 启动5个线程来处理订单
for (int i = 0; i < min; i++) {
executor.submit(() -> {
try {
// 每个线程不断从队列中取出订单进行处理
while (!queue.isEmpty()) {
String orderNo = queue.poll(10, TimeUnit.MILLISECONDS);
// 超时机制防止死循环
if (StringUtils.isNotBlank(orderNo)) {
// 业务逻辑
Sysrtem.out.println(orderNo);
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 确保线程结束时调用countDown
latch.countDown();
}
});
}
// 等待所有线程执行完毕
latch.await();
// 全部执行后执行的业务逻辑
Sysrtem.out.println("全部执行完成");