Java多线程并行处理任务的实现

2023-11-18

Java多线程并行处理任务的实现

在实际项目开发的过程中,遇到过需要处理一个由多个子任务组成的任务的问题.顺序处理起来会造成响应时间超长,用户体验不好的问题.我想到一个解决方案,即使用多线程并行处理子任务.思路就是使用ThreadPoolExecutor线程池,然后使用一个list保存所有线程的实例引用.以下是代码实现.

以下是代码实现

FactorialCalculator 类:用于实现具体的业务处理

package ThreadTask;

import java.util.concurrent.Callable;

public class FactorialCalculator implements Callable<Integer> {
    private int number;

    public FactorialCalculator(int number) {
        this.number = number;
    }

    //计算阶乘
    public Integer call() throws Exception {
        Integer result = 1;
        if (number == 0 || number == 1)
            result = 1;
        else {
            for (int i = 2; i <= number; i++) {
                result *= i;
                //为了演示效果,休眠20ms
                Thread.sleep(20);
            }
        }
        System.out.printf("线程:%s," + number + "!= %d\n", Thread.currentThread().getName(), result);
        return result;
    }

}

Main 类:用于实现多线程任务的实现和处理

import ThreadTask.FactorialCalculator;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;


public class Main {

    public static void main(String[] args) {
        Long startTime = System.currentTimeMillis();
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);//创建只有2个线程的线程池
        //存放结果的列表
        List<Future<Integer>> resultList = new ArrayList<>();
        //通过Random类生成一个随机数生成器
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            int number = random.nextInt(10);
            FactorialCalculator calculator = new FactorialCalculator(number);
            Future<Integer> result = executor.submit(calculator);
            resultList.add(result);
        }
        //创建一个循环来监控执行器的状态
        try {
            while (executor.getCompletedTaskCount() < resultList.size()) {
                System.out.printf("\n已完成的线程数量: %d\n", executor.getCompletedTaskCount());
                for (int i = 0; i < resultList.size(); i++) {
                    Future<Integer> result = resultList.get(i);
                    System.out.printf("第 %d 个线程 : 是否完成:%s\n", i, result.isDone());
                }
                Thread.sleep(50);
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("全部线程执行结束");
        try {
            for (int i = 0; i < resultList.size(); i++) {
                Future<Integer> result = resultList.get(i);
                Integer number = null;
                number = result.get();
                System.out.printf("第 %d 个线程 执行结果是: %d\n", i, number);
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        executor.shutdown();
        Long endTime = System.currentTimeMillis();
        System.out.println("使用时间 = [" + (endTime - startTime) + "]");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java多线程并行处理任务的实现 的相关文章

  • 如何在 JPA 中使用枚举

    我有一个电影租赁系统的现有数据库 每部电影都有一个评级属性 在 SQL 中 他们使用约束来限制该属性的允许值 CONSTRAINT film rating check CHECK rating text text OR rating tex
  • 不同的 JDK 更新会产生不同的 Java 字节码吗?

    假设场景 我有一个项目 其源合规性级别指定为 1 5 现在 我使用两种不同的 JDK 编译此项目 首先使用 JDK 6 Update 7 然后使用 JDK 6 Update 20 这两个不同的 JDK 是否会生成不同的 Java 字节代码
  • 使用 Spring MVC 返回 PDF 文件

    实际上 我有这个功能 我有一个框架 可以在其中设置 URL ip port birt preview report report rptdesign format pdf parameters 并且该框架呈现 PDF 文件 但我想隐藏该网址
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • 我们如何测试我们的 Java UI?

    我们正在寻找记录和回放类型的测试工具来自动化我们的一些 UI 功能测试 我们已经研究了从 Silke 到 QTP 的大多数常见嫌疑 但没有一个起作用 当需要右键单击才能从右键单击菜单中选择某些内容时 或者当您必须在网格的下拉列表中选择一个值
  • JPA:如何将字符串持久保存到数据库字段中,输入 MYSQL Text

    需求是用户可以写文章 所以我选择typeText为了contentmysql数据库内的字段 我怎样才能转换Java String into MySQL Text 干得好Jim Tough Entity public class Articl
  • 在 Java 中填充布尔数组

    作为一名相当新手的 Java 程序员 我给自己设定了一个艰巨的挑战 尝试编写一个简单的文本冒险 不出所料 我已经遇到了困难 我试图为我的 Location 类提供一个属性来存储它包含的退出 我为此使用了一个布尔数组 本质上保存代表每个出口的
  • Java byte[] 与 String 之间的转换

    为什么这个junit测试失败了 import org junit Assert import org junit Test import java io UnsupportedEncodingException public class T
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • 在 JavaFX 中拖动未装饰的舞台

    我希望将舞台设置为 未装饰 使其可拖动且可最小化 问题是我找不到这样做的方法 因为我遇到的示例是通过插入到主方法中的方法来实现的 我想通过控制器类中声明的方法来完成此操作 就像我如何使用下面的 WindowClose 方法来完成此操作 这是
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • 在 Java 中使用 Inflater 解压缩 gzip 数据

    我正在尝试使用以下方法解压缩 gzip 数据Inflater 根据文档 如果参数 nowrap 为 true 则 ZLIB 标头和校验和 字段将不会被使用 这提供了与 GZIP 和 PKZIP 使用的压缩格式 注意 使用 nowrap 选项
  • 如何告诉 cxf 将包装类型保留在方法中?

    在我的 WSDL 中我有一个操作
  • Akka 和 spring 配置

    我正在尝试将 akka 与 spring 结合起来 但没有成功 基本上 我的应用程序似乎不习惯读取 akka 模式 具有架构的 service context xml 的一部分
  • java Runtime.getRunTime().exec 和通配符?

    我正在尝试使用删除垃圾文件 Process p Runtime getRuntime exec 只要我不使用通配符 它 就可以正常工作 即 Process p Runtime getRuntime exec bin rm f specifi
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • Storm Spout 未收到 Ack

    我已经开始使用storm 所以我使用创建简单的拓扑本教程 https github com nathanmarz storm wiki Tutorial 当我运行我的拓扑时LocalCluster一切看起来都很好 我的问题是我没有得到元组的
  • 如何修改生成的SOAP请求?

    我正处于创建输出拦截器并从 SOAP 消息中获取 OuputStream 的阶段 但是 如何在将 SOAP 信封发送到端点之前对其进行修改呢 我想删除一些 xml 元素 一种方法是获取文档并通过 XSLT 转换运行它 您可以通过调用来获取拦
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe
  • JSP 和 scriptlet

    我知道现在使用 scriptlet 被认为是禁忌 没关系 我会同意Top Star的话 因为我目前只是Java新手 到目前为止我听到的是 它是为了让设计师的生活更轻松 但我想知道 这是否与JSP页面的性能有关 另一方面 如果只是为了 让设计

随机推荐

  • STM32F407 CAN1 CAN2

    注意CAN1可以单独使用 CAN2要开启CAN1时钟才能使用 u8 CAN1 Mode Init u8 mode GPIO InitTypeDef GPIO InitStructure CAN InitTypeDef CAN InitStr
  • DBeaver 如何配置离线驱动

    1 打开已经下载过DBeaver驱动的软件 点击 数据库 驱动管理器 进入 2 选中 MySQL 点击右侧的 编辑 进入 3 点击页签 库 打开列表内容 选中 mysql connector java 8 0 17 jar 点击 类路径 4
  • Android用surface直接显示yuv数据(二)

    研究了一段时间Android的surface系统 一直执着地认为所有在surface或者屏幕上显示的画面 必须要转换成RGB才能显示 yuv数据也要通过颜色空间转换成RGB才能显示 可最近在研究stagefright视频显示时发现 根本找不
  • 泰克

    主要功能 硬件连接 参数配置 运行参数 数据查询 程控对象 示波器 程控接口 兼容市面上所有具有GPIB USB RS232 LAN RS485 TTL任意一种程控接口的示波器 仪器兼容性 泰克Tektronix 是德科技Keysight
  • CISC RISC ARM MIPS区别与联系

    转载 文章有点老 不过还是有所收获 补充一句 国内那么多牛人研究处理器架构 要钱有钱 要人有人 ARM都能获得如此成就 为啥国产那么多CPU团队都不成功 其它类型的芯片也一样 大多都是买国外IP 个人理解 相关专利太少 也就是积累不足 无法
  • 【MATLAB第31期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理回归问题MATLAB代码实现(持续更新)

    MATLAB第31期 基于MATLAB的降维 全局敏感性分析 特征排序 数据处理回归问题MATLAB代码实现 持续更新 本文敏感性分析主要分析回归问题 下期分析分类问题 fisher rf arf nca等 内容更新 增加视频解说 基于MA
  • npm创建openlayer(入门)

    1 搭建node js开发环境 2 创建目录 mkdir ol deme 3 安装ol包 npx create ol app 4 打开 npm start
  • flex布局和grid布局

    flex布局 父容器 parent 8个设置项 parent display flex flex direction row row reverse column column reverse 决定子元素的排列方式 flex wrap no
  • 服务器系统磁盘分区,服务器磁盘分区教程

    服务器磁盘分区教程 内容精选 换一换 对于Linux弹性云服务器 磁盘分区与磁盘设备名称完全对应 本节以Red Hat Enterprise Linux 7的图形界面为例 介绍查询Linux弹性云服务器磁盘分区与磁盘设备的方法 以root权
  • pandas导入和导出数据至MySQL数据库

    安装准备 可以不用看 同学们在进行数据分析 数据处理时经常会使用pandas来储存结构化数据 我们在数据处理中会出现各种的过程文件或最终文件 虽然pandas给我们提供了非常多的输出结口 比如csv文件 xlsx文件 但在软件开发过程中db
  • 关于httpurlconnection getcontentlength返回值为-1的问题

    在做AsyncTask异步任务读取网络数据的时候 发现了httpUrlConnection的获取数据内容长度 connection getContentLength 总是为 1 导致进度条一直为灰色状态 预期结果应如图所示 而现在的效果是这
  • 网络协议的三要素

    一个网络协议主要由语法 语义和同步三个要素组成 1 语法 语法指数据与控制信息的结构或格式 确定通信时采用的数据格式 编码及信号电平等 2 语义 语义由通信过程的说明构成 它规定了需要发出何种控制信息 完成何种控制动作以及做出何种应答 对发
  • timeout in locking authority file in /home/**/.Xauthority,

    进入终端后使用startx命令 看是否有错误提示 我的当时是 timeout in locking authority file in home Xauthority 解决办法是将 Xauthority删掉 在检查用户目录权限 确定为775
  • Mesh(802.11s)组网 — 基于OpenWRT路由器

    一 mesh网络 1 mesh网络拓补图 2 介绍 二 OpenWRT路由器Mesh网络配置 1 准备阶段 说明 本次测试用2台单WiFi路由器作为测试 wifi用于组建Mesh网络连接 因此内网已无额外WiFi可以提供使用 因此局域网用有
  • Android Studio3.5.2 设置代码提示和代码自动补全快捷键

    方法步骤如下 1 左上角点击File选项 找到Settings 2 点击Settings后 找到Editor 3 点击Editor后 找到General 点击General 找到Code Completion 从图中我们可以看到标红 选择F
  • 实时时钟DS1302原理详解和单片机编程

    一 DS1302的功能 DS1302是美国DALLAS推出的一款高性能 低功耗的日历时钟芯片 DS1302是一种串行接口的实时时钟 芯片内部具有可编程的日历时钟和31个字节的静态RAM 日历时钟可以自动进行闰年补偿 计时准确 接口简单 使用
  • mfc读取txt文件一列数据到double数组中

    CString filepath filepath C Users Administrator source repos MFCApplication8 Debug data txt std vector
  • 用jquery插件实现手风琴效果

  • 电脑性能一目了然,教你用测试软件测试整机性能

    一台笔记本电脑或者是一台DIY台式电脑 都是由处理器 显卡 硬盘等配件构成 而每个配件都有自己的性能 性能是高是低我们可以进行单项测试 对于整机性能我们也可以对其进行测试 来看看它的真实性能到底如何 CPU中文名叫中央处理器 它是一台电脑中
  • Java多线程并行处理任务的实现

    Java多线程并行处理任务的实现 在实际项目开发的过程中 遇到过需要处理一个由多个子任务组成的任务的问题 顺序处理起来会造成响应时间超长 用户体验不好的问题 我想到一个解决方案 即使用多线程并行处理子任务 思路就是使用ThreadPoolE