Java并发编程 优化多任务查询接口
代码展示
@RestController
@RequestMapping("/api")
public class TestController {
@Resource
private SourceService sourceService;
@Resource
private StudentService studentService;
@Resource
private TeacherService teacherService;
@Resource
private Executor executor;
@PostMapping("/multithreading")
public List<Object> multithreading() throws InterruptedException {
//记录开始时间
long startingTime = System.currentTimeMillis();
//线程计数器 定义为3
CountDownLatch downLatch = new CountDownLatch(3);
//防止并发操作情况下出现 并发修改异常,单线程不存在这个问题,CopyOnWriteArrayList底层使用Lock锁,性能可以被保证
List<Object> list = new CopyOnWriteArrayList<>();
//线程1: 查询 source表 并添加到list
executor.execute(() -> {
list.add(sourceService.findAll());
downLatch.countDown();// 线程计数器-1
});
//线程2: 查询 teacher表 并添加到list
executor.execute(() -> {
list.add(teacherService.findAll());
downLatch.countDown();// 线程计数器-1
});
//线程3: 查询 teacher表 并添加到list
executor.execute(() -> {
list.add(studentService.findAll());
downLatch.countDown();// 线程计数器-1
});
downLatch.await();//如果计数到达零,则释放所有等待的线程
//响应结果 取决最后一个线程执行时间
long endingTime = System.currentTimeMillis();
System.out.println("多线程耗时:" + (endingTime - startingTime) + "ms");
return list;
}
@PostMapping("/singleThread")
public List<Object> singleThread() {
//记录开始时间
long startingTime = System.currentTimeMillis();
List<Object> list = new ArrayList<>();
//执行查询
list.add(sourceService.findAll());
list.add(teacherService.findAll());
list.add(studentService.findAll());
//结束时间
long endingTime = System.currentTimeMillis();
System.out.println("单线程耗时:" + (endingTime - startingTime) + "ms");
return list;
}
}
执行结果
多线程响应结果平均: 14.8ms

单线程响应结果平均: 31.4ms

ps:在任务量多的情况下 多线程速度会越来越显著
Java并发编程 优化多任务查询接口的更多相关文章
- Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
- 《Java并发编程的艺术》笔记
第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种:无锁并发编程.CAS算法.使用最少线程.使 ...
- Java并发编程面试题 Top 50 整理版
本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然 ...
- Java并发编程75道面试题及答案
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
- Java并发编程基础-线程安全问题及JMM(volatile)
什么情况下应该使用多线程 : 线程出现的目的是什么?解决进程中多任务的实时性问题?其实简单来说,也就是解决“阻塞”的问题,阻塞的意思就是程序运行到某个函数或过程后等待某些事件发生而暂时停止 CPU 占 ...
- Java并发编程73道面试题及答案 —— 面试稳了
今天主要整理一下 Java 并发编程在面试中的常见问题,希望对需要的读者有用. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任 ...
- Java并发编程系列-(5) Java并发容器
5 并发容器 5.1 Hashtable.HashMap.TreeMap.HashSet.LinkedHashMap 在介绍并发容器之前,先分析下普通的容器,以及相应的实现,方便后续的对比. Hash ...
- Java并发编程:Callable、Future和FutureTask
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- (转)Java并发编程:Callable、Future和FutureTask
Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...
- 转: 【Java并发编程】之二十:并发新特性—Lock锁和条件变量(含代码)
简单使用Lock锁 Java5中引入了新的锁机制--Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...
随机推荐
- Linux修改Python软链接
Linux修改python软链接 0. 适用场景及基础知识 适用场景: 有些自带的是python3命令,嫌输入太麻烦,可以修改成python命令 有些自带是python是python2,想修改成pyt ...
- 驱动开发:内核解析PE结构节表
在笔者上一篇文章<驱动开发:内核解析PE结构导出表>介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上 ...
- 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!
在Java中,创建线程是一项非常重要的任务.线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高.Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 ...
- 2023-06-09:什么是Redis事务?原理是什么?
2023-06-09:什么是Redis事务?原理是什么? 答案2023-06-09: Redis中的事务是以一组命令的形式出现的,这些命令被认为是最小的执行单位.事务可以保证在一个单独独立的隔离操作中 ...
- 【城南】如何识别AI生成图?视觉AIGC伪造检测技术综述
如何识别 AI 生成图片?or 如何识别 AIGC 图?or 如何识别 AI 换脸?or AI生成图伪造检测? 类似的说法有很多种,总之就是利用AI技术来鉴别一张图是不是AI生成的,这种AI技术就是本 ...
- Python 标准类库-并发执行之multiprocessing-基于进程的并行
实践环境 Python3.6 介绍 multiprocessing是一个支持使用类似于线程模块的API派生进程的包.该包同时提供本地和远程并发,通过使用子进程而不是线程,有效地避开了全局解释器锁.因此 ...
- Taro项目引入Tailwindcss
前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别,同时还补全各种浏览器模式前缀,兼容性也不错.它的工作原理是扫描所有 HTML 文件.JavaScri ...
- Go语言中的原子操作
1. 引言 在并发编程中,多个协程同时访问和修改共享数据时,如果没有使用适当的机制来防止并发问题,这个时候可能导致不确定的结果.数据不一致性.逻辑错误等严重后果. 而原子操作是解决并发编程中共享数据访 ...
- 前端Vue自定义顶部搜索框 热门搜索 历史搜索 用于搜索跳转使用
前端Vue自定义顶部搜索框 热门搜索 历史搜索 用于搜索跳转使用, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13128 效 ...
- 逍遥自在学C语言 | 指针陷阱-空指针与野指针
前言 在C语言中,指针是一种非常强大和灵活的工具,但同时也容易引发一些问题,其中包括空指针和野指针. 本文将带你了解这两个概念的含义.产生原因以及如何避免它们所导致的问题. 一.人物简介 第一位闪亮登 ...