线程异步在项目中的使用

在我们进行海量数据的处理时,如果通过传统的方式也就是同步的方式进行查询等操作,对用户的响应时间是不友好的。而引入线程异步操作之后,则会大大改善我们查询等操作消耗的时间。

我们同时对两个均含有10万条数据的表进行查询,未使用线程异步的代码如下:

   public void unusedThread() {
        long startTime = System.currentTimeMillis(); //获取开始时间
        List<TbUser> tbUserList = tbUserService.list();
        //获取user1
        List<TbUser1> user1List = tbUser1Service.list();
        long endTime = System.currentTimeMillis(); //获取结束时间
        System.out.println("未使用线程池查询所耗费的时间为:" + (endTime - startTime) + "ms");
    }

耗时如下:
在这里插入图片描述

使用线程异步的代码:

 public void usedThread() {
        long startTime = System.currentTimeMillis(); //获取开始时间
        TimeUnit unit;
        BlockingQueue workQueue;
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5,
                10, 15, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(5),
                new ThreadPoolExecutor.CallerRunsPolicy());
        //异步执行
        CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {
            List<TbUser> tbUserList = tbUserService.list();
        }, executor);
        //异步执行
        CompletableFuture<Void> addressFuture1 = CompletableFuture.runAsync(() -> {
            List<TbUser1> tbUser1List = tbUser1Service.list();

        }, executor);
        long endTime = System.currentTimeMillis(); //获取结束时间
        System.out.println("使用线程池查询所耗费的时间为:" + (endTime - startTime) + "ms");

耗时如下:
在这里插入图片描述

最终两者的耗时对比:
在这里插入图片描述

可以看出对于查询的操作,由于异步的线程,两个查询均不受到互相的影响,无需等待另外一个查询结束之后才会进行下一步的操作,同时我们也可以看出,这两个线程下的执行内容对后面的执行完全没有任何影响,但是在使用时一定要注意线程安全的问题。
下面补充一下CompletableFuture实现等待所有异步任务完成:

CompletableFuture<Void> all = CompletableFuture.allOf(addressFuture, addressFuture1);
                    all.join();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZNineSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值