iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java并行执行任务的方案有哪些
  • 575
分享到

Java并行执行任务的方案有哪些

2023-06-25 13:06:44 575人浏览 八月长安
摘要

本篇内容介绍了“Java并行执行任务的方案有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景最近在排查生产环境问题,发现商品详情接口时

本篇内容介绍了“Java并行执行任务的方案有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

背景

最近在排查生产环境问题,发现商品详情接口时不时会报rpc调用超时,检查代码发现接口里面查询活动耗时比较长,都是串行执行的,仔细查看发现完全可以改成并行去执行,缩短接口查询耗时。

比如我们的商品详情接口,需要展示立减、阶梯满减、团购等活动标签。需要查询三次不同的活动信息,再组装活动标签信息。

如果每次查询耗时1s,按照串行的方式去调用,整个接口下来至少需要3s,整个耗时,对于我们来讲是无法接受的。其实在jdk中,给我们提供了几种非常便捷的并行执行任务的方法。

  • CountDownLatch

  • ExecutorService.invokeAll()

  • Fork/Join 分而治之 有点类似mapReduce的影子,这个有兴趣的可以自行去了解

改进方案

代码例子:

private void assemblyActivityTag(CartItemDTO itemDTO){        //1.查询立减活动信息,耗时1s                 //2.查询阶梯满减活动信息,耗时1s                //3.查询团购活动信息,耗时1s                //4.组装活动标签信息,耗时1s         // 串行执行下来整个耗时4s    }

CountDownLatch

private void assemblyActivityTag(CartItemDTO itemDTO){        ExecutorService executorService = Executors.newCachedThreadPool();        CountDownLatch latch = new CountDownLatch(3);        executorService.execute(new Runnable() {            @Override            public void run() {            //1.查询立减活动信息                latch.countDown();            }        });        executorService.execute(new Runnable() {            @Override            public void run() {                //2.查询阶梯满减活动信息                latch.countDown();            }        });        executorService.execute(new Runnable() {            @Override            public void run() {                //3.查询团购活动信息                latch.countDown();            }        });        try {            // 一定记得加上timeout时间,防止阻塞主线程            latch.await(3000,TimeUnit.MILLISECONDS);        } catch (InterruptedException e) {            e.printStackTrace();        }        //4.等待所有子任务完成,组装活动标签信息                 //5.关闭线程池        executorService.shutdown();    }

ExecutorService.invokeAll()

private void assemblyActivityTag(CartItemDTO itemDTO) {        ExecutorService executorService = Executors.newCachedThreadPool();        List<Callable<String>> tasks = Lists.newArrayList();        tasks.add(new Callable<String>() {            @Override            public String call() throws Exception {                //1.查询立减活动信息                return null;            }        });        tasks.add(new Callable<String>() {            @Override            public String call() throws Exception {                //2.查询阶梯满减活动信息                return null;            }        });        tasks.add(new Callable<String>() {            @Override            public String call() throws Exception {                //3.查询团购活动信息                return null;            }        });        try {            List<Future<String>> futureList = executorService.invokeAll(tasks, 3000, TimeUnit.MILLISECONDS);            for (Future<String> future : futureList) {                // 获取线程执行结果                try {                    String activityTag = future.get();                } catch (ExecutionException e) {                    e.printStackTrace();                }            }        } catch (InterruptedException e) {            e.printStackTrace();        }        //4.组装活动标签信息        //5.关闭线程池        executorService.shutdown();    }

注意点和区别

在使用CountDownLatch,尽可能使用线程安全容器去处理子线程的返回值,避免多线程情况下,出现脏数据。

如果想知道每个子线程的对应的返回值,ExecutorService.invokeAll()方式,是没法区分的,只能依赖返回值的顺序去匹配。

使用上面2种方式时,切记设置超时时间,防止子任务执行时间过长,阻塞主线程任务

线程池用完结束,记得shutdown()

java并行执行任务demo

在一个方法中同时调用多个方法或者服务,并等待所有结果返回

package com.test.demo;import org.junit.Test;import java.util.concurrent.CompletableFuture;public class TestFuture {    @Test    public void testA(){        CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> c());        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> a());        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> b());        try {            //获取并行执行任务结果            System.out.println(future3.get());            System.out.println(future1.get());            System.out.println(future2.get());        }catch (Exception e){        }    }    public String a(){        try {            Thread.sleep(1000);        }catch (Exception e){        }        return "a";    }    private String b(){        try {            //模拟业务执行时间            Thread.sleep(2000);        }catch (Exception e){        }        return "b";    }    private String c(){        try {            //模拟业务执行时间            Thread.sleep(5000);        }catch (Exception e){        }        return "c";    }}

测试结果:

Java并行执行任务的方案有哪些

从执行结果中可以看到一共耗时5s,如果同步进行执行,耗时应该在8s

“Java并行执行任务的方案有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java并行执行任务的方案有哪些

本文链接: https://www.lsjlt.com/news/304885.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java并行执行任务的方案有哪些
    本篇内容介绍了“Java并行执行任务的方案有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景最近在排查生产环境问题,发现商品详情接口时...
    99+
    2023-06-25
  • Java并行执行任务的几种方案小结
    目录背景改进方案注意点和区别java并行执行任务demo背景 最近在排查生产环境问题,发现商品详情接口时不时会报RPC调用超时,检查代码发现接口里面查询活动耗时比较长,都是串行执行的...
    99+
    2024-04-02
  • php计划任务定时执行的方法有哪些
    1. 使用系统的crontab工具,配置定时任务。2. 使用PHP的swoole扩展中的定时器功能。3. 使用第三方的定时任务管理工...
    99+
    2023-06-12
    php计划任务 php
  • java执行jar包的方法有哪些
    Java执行JAR包的方法有以下几种:1. 命令行方式:打开命令行窗口,使用java命令执行JAR包。例如:java -jar yo...
    99+
    2023-08-08
    java jar
  • Java批量执行的方法有哪些
    Java中批量执行的方法有以下几种:1. 使用for循环进行批量执行:通过for循环遍历一个集合或数组,然后依次执行相同的操作。``...
    99+
    2023-08-09
    Java
  • spring定时任务没有执行的原因有哪些
    1. 配置错误:可能是由于配置文件中的定时任务配置错误,导致定时任务无法正确识别和执行。2. 依赖错误:如果定时任务依赖的某个组件或...
    99+
    2023-08-24
    spring
  • Java任务定时执行器案例的实现
    目录⭐️前面的话⭐️1.定时器概述1.1认识定时器1.2Timer类的使用2.定时器的简单实现⭐️前面的话⭐️ 本篇文章将介绍Java多线程案例,定时器,定时器就像闹钟一样,等到了指...
    99+
    2024-04-02
  • linux定时任务不执行的原因有哪些
    任务的执行时间设置错误:可能是任务的执行时间设置不正确,导致任务没有按照预期执行。可以通过检查任务的时间设置来解决该问题。 ...
    99+
    2023-10-23
    linux
  • java线程停止执行的方法有哪些
    Java线程停止执行的方法有以下几种:1. 使用标志位停止线程:在线程的执行过程中,通过设置一个标志位来控制线程是否停止执行。线程可...
    99+
    2023-08-08
    java
  • Perl中执行最常见的编程任务有哪些
    这篇文章主要介绍了Perl中执行最常见的编程任务有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Perl是一种非常简单、应用广泛且反响很好的脚本语言。它可用于各种任务(例...
    99+
    2023-06-17
  • Golang中的任务并发执行和Go WaitGroup
    在Golang中,任务的并发执行可以通过goroutine和channel来实现。Goroutine是轻量级的线程,可以并发执行多个...
    99+
    2023-10-09
    Golang
  • C#怎么使用Task实现执行并行任务
    这篇“C#怎么使用Task实现执行并行任务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#怎么使用Task实现执行并行任务...
    99+
    2023-07-05
  • SQL语句的执行方式有哪些
    SQL语句的执行方式有以下几种:1. 交互式执行:即通过命令行或者可视化工具直接输入SQL语句并执行,结果即时显示。2. 批处理执行...
    99+
    2023-09-23
    SQL
  • Shell.Application执行命令的方法有哪些
    这篇文章将为大家详细讲解有关Shell.Application执行命令的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码如下:Set objShellApp = ...
    99+
    2023-06-08
  • shell脚本的执行方式有哪些
    今天就跟大家聊聊有关shell脚本的执行方式有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先,看下我们的脚本内容[tan@tan scripts]$ ll...
    99+
    2023-06-09
  • redis执行加锁的方法有哪些
    Redis执行加锁的方法有以下几种:1. SETNX命令:使用SETNX命令设置一个带有过期时间的键值对,只有在键不存在时才能设置成...
    99+
    2023-08-24
    redis
  • Linux执行脚本的方式有哪些
    Linux执行脚本的方式有以下几种:1. 使用命令行执行脚本:在终端中输入脚本的路径和名称,例如 `./script.sh`。2. ...
    99+
    2023-09-27
    Linux
  • quartz定时执行任务,并配置web.xml的操作方法
    今天项目上需要做个定时任务,临时学的,quartz的功能还是很强大用起来也方便,这里的demo只是实现每天定时执行一次,其他功能可以在此基础上继续深入学习,哈哈 睡觉,明天继续。一、maven依赖:<dependency> &...
    99+
    2023-05-31
    quartz web.xml 配置
  • java并行机制的特点有哪些
    Java并行机制的特点有: 并发性:Java提供了多线程机制,可以同时执行多个线程,实现并发执行。 共享性:多个线程可以共享同一个...
    99+
    2023-10-26
    java
  • Java实现多任务执行助手
    本文实例为大家分享了Java实现多任务执行助手的具体代码,供大家参考,具体内容如下 1.多线程执行任务类 package com.visy.threadpool; import c...
    99+
    2022-11-13
    Java多任务执行助手 Java多任务执行 Java多任务
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作