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接 ... 
随机推荐
- remote: HTTP Basic:Access denied fatal:Authentication failed for
			近来在一天新电脑上面使用git pull 一个项目,老是提示 Access denied, 找了许多方法,ssh key这些都配置了还是不行,当时别提有多尬 看嘛这就是pull 时的提示 // *** ... 
- django 如何提升性能(高并发)
			django 如何提升性能(高并发) 对一个后端开发程序员来说,提升性能指标主要有两个一个是并发数,另一个是响应时间网站性能的优化一般包括 web 前端性能优化,应用服务器性能优化,存储服务器优化. ... 
- odoo开发教程八:qweb引擎
			一:简介 QWeb是一个基于xml的模板引擎,用于生成HTML片段和页面,模板指令是写在xml标签中的以t-开头的属性,比如t-if如果要让一个标签不被渲染,可以采用t来包裹,这样会执行它里面的命令但 ... 
- 逍遥自在学C语言 | 揭开while循环的神秘面纱
			前言 循环是一种重要的控制结构,可以使程序重复执行一段代码,直到满足特定条件为止. 在C语言中,while和do-while是两种常用的循环结构,本文将详细介绍这两种循环的用法. 一.人物简介 第一位 ... 
- Python连接es笔记三之es更新操作
			本文首发于公众号:Hunter后端 原文链接:Python连接es笔记三之es更新操作 这一篇笔记介绍如何使用 Python 对数据进行更新操作. 对于 es 的更新的操作,不用到 Search() ... 
- JDK动态代理和CGLIB代理有什么区别
			JDK动态代理和CGLIB代理都是实现Spring框架中AOP的代理方式,它们的实现原理和应用场景有所不同, 具体区别如下: 1. 实现原理: JDK动态代理是基于Java反射机制实现的,它要求目标类 ... 
- C# 版本特性一览
			前言 使用 C# 作为开发语言已经 15 个年头了,受惠于 C# 的不断更新,伴随着大量的新特性与大量语法糖,让我更加容易写出简洁.高效的代码.日常中大量特性早已信手拈来,当然从未尝试过的特性更是难以 ... 
- 从n个不同元素中有放回的取出r个且不计顺序,有多少种不同的取法?
			从n个不同元素中有放回的取出r个且不计顺序,有多少种不同的取法? 答案是:\(C_{n+r-1}^r\) 解析 因为是有放回地取出,所以同一个元素可能会被取多次,并且取出的元素是不计顺序的,那么如果我 ... 
- 【python基础】文件-文件路径
			1.文件路径 我们发现不管是写入还是写出操作,我们提供的都是文件名,其实这里准确说应该是文件路径.当我们简单把文件名传递给open函数时,Python将在当前执行程序的文件所在的目录中查找文件名所代表 ... 
- git reset --hard 撤回后commit的代码消失了的解决办法
			楼主在今天的工作中使用了这个命令 git reset --hard 撤回后commit的代码消失了,因为有commit,所以暂时得到了拯救,太不容易了,差点以为自己写的代码没了. 网上到处找帖子,看看 ... 
