当前位置: 首页 > news >正文

【线程池】如何判断线程池中的任务执行完毕(三)

                                               

目录

                                               

前言

1. isTerminated()方法

2. awaitTermination()方法

3.getTaskCount()方法和executor.getCompletedTaskCount()方法结合使用

4.使用CountDownlatch类


                                                前言

         通常我们使用线程池的时候,系统处于运行的状态,而线程池本身就是主要为了线程复用,需要线程池跟随系统一直跑起来。

        大多数时候,对于我们来说线程池就是一个黑盒,纵然我们可能对线程池的实现,底层原理盘的比老核桃还圆润,但是对于线程池的异常处理、事务处理、上下文传递、以及如何判断线程池中的任务执行状态,我们仍然是不可言状的。无法掌控、无法预测,会在一些细微时候给我们的应用程序带来致命一击。

        那么我来聊下以下几种判断线程池中任务是否执行完毕的方式,谁赞成,谁反对。


          

        我们先把线程池启动起来,线程数5个,往线程池中提交10个任务。

        

        基于上面的线程池,开始表演


        1. isTerminated()方法

        通过终止线程池 判断线程池中是否终止 来判断任务是否执行完毕 但是一般线程池也不会终止,不推荐使用。

        但是,有些个别情况我们确实需要停止线程池,比如系统停止的时候,异常终止的时候,如何优雅的停止线程池不得不来考虑下,在高负荷的系统中,停止线程池好似那狂奔180迈的迈巴赫踩下刹车,能安全平稳的停下来最好不过了。

        //终止线程池executor.shutdown();while (!executor.isTerminated()) {try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("线程还在执行中");long taskCount = executor.getCompletedTaskCount();System.out.println("完成的任务数:" + taskCount);}

        执行结果如下,完成任务数10

        2. awaitTermination()方法

        使用awaitTermination()方法会阻塞当前线程,等待线程池执行任务,但是呢这个等待的时间是不确定,好似等待约会的女孩化妆,耗时不固定,但等待时间要足够长,缺点就是不可控,不可预测,正如我们的人生一样,茫茫无边际。

        如果等待时间足够长,输出是没问题的

        try {executor.awaitTermination(10, TimeUnit.SECONDS);long taskCount = executor.getCompletedTaskCount();System.out.println("完成的任务数:" + taskCount);} catch (InterruptedException e) {e.printStackTrace();}

          

        但如果恰好配置的时间不够,我们给配置成1s,就像恋爱时追女孩子的耐心不够,不好意思,你等不完她的化妆时间,注定孤独一生,自然也完成不了所有的任务

         可以看到我们在获取任务完成个数的时候只有5条。    

3. getTaskCount()方法和executor.getCompletedTaskCount()方法结合使用

while (executor.getTaskCount() != executor.getCompletedTaskCount()) {System.out.println("所有任务数:" + executor.getTaskCount() + ";已完成任务数" + executor.getCompletedTaskCount());}System.out.println("最后已完成的任务数:" + executor.getCompletedTaskCount());


4. 使用CountDownlatch类

        很多时候线程池并不专一,喜欢脚踏多个业务船,可能提交多种业务数据,我们只想看到我们提交的业务数据执行情况。    

        比如下面,我们再提交15条任务给线程池,线程池这家伙可是来着不拒的。

//在业务线程池正在执行上面10条任务的时候,再新提交15条任务,而我们只关注这15条任务该怎么做呢for (int i = 0; i < 15; i++) {int finalI = i;executor.execute(() -> {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("【新提交的任务】" + Thread.currentThread().getName() + " 执行完了第" + finalI + "个任务") ;});}

        这个时候我们就可以请求外援,使用CountDownlatch来进行上述代码的改造,通过countDown()方法进行计数,await()方法阻塞等待,对完成的任务进行判断。 

        CountDownLatch latch = new CountDownLatch(15);for (int i = 0; i < 15; i++) {int finalI = i;executor.execute(() -> {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("【新提交的任务】" + Thread.currentThread().getName() + " 执行完了第" + finalI + "个任务") ;latch.countDown();});}latch.await();System.out.println("新提交的任务执行完成啦");System.out.println("最后已完成的总计任务数:" + executor.getCompletedTaskCount());

5. 手动维护一个线程安全的计数器

        比如说JUC包下常见的基于CAS的AtomicInteger类,基于底层的unsafe类,在多线程的情况下依然可以保证线程的安全,我们可以放心的将它在线程池中进行累加,直到累加到和提交的任务数量一致,线程池也就执行完了所有的任务。

6. 使用Future

        我们也可以换个路子,提交线程池不适用execute()方法,使用submit()方法,记得使用submit()方法要谨慎些,具体的坑可以参考之前的文章【线程池】换个姿势来看线程池中不一样的阻塞队列(一)_走了一些弯路的博客-CSDN博客

       

相关文章:

【线程池】如何判断线程池中的任务执行完毕(三)

目录 前言 1. isTerminated()方法 2. awaitTermination()方法 3.getTaskCount()方法和executor.getCompletedTaskCount()方法结合使用 4.使用CountDownlatch类 前言 通常我们使用线程池的时候&#xff0c;系统处于运行的状态&#xff0c;而线程池本身就是主要为了线程复用&…...

Qt/C++编写视频监控系统81-Onvif报警抓图和录像并回放

一、前言 视频监控系统中的图文警情模块&#xff0c;是通过Onvif协议的事件订阅拿到的&#xff0c;通过事件订阅后&#xff0c;设备的各种报警事件比如入侵报警/遮挡报警/越界报警/开关量报警等&#xff0c;触发后都会主动往订阅者发送&#xff0c;而且一般都是会发送两次&…...

浅谈安防视频监控平台EasyCVR视频汇聚平台对于夏季可视化智能溺水安全告警平台的重要性

每年夏天都是溺水事故高发的时期&#xff0c;许多未成年人喜欢在有水源的地方嬉戏&#xff0c;这导致了悲剧的发生。常见的溺水事故发生地包括水库、水坑、池塘、河流、溪边和海边等场所。 为了加强溺水风险的提示和预警&#xff0c;完善各类安全防护设施&#xff0c;并及时发现…...

基于单片机的串行通信发射机设计

一、项目介绍 串行通信是一种常见的数据传输方式&#xff0c;允许将数据以比特流的形式在发送端和接收端之间传输。当前实现基于STC89C52单片机的串行通信发射机&#xff0c;通过红外发射管和接收头实现自定义协议的数据无线传输。 二、系统设计 2.1 单片机选择 在本设计中&…...

MySQL数据库——多表查询(3)-自连接、联合查询、子查询

目录 自连接 查询语法 自连接演示 联合查询 查询语法 子查询 介绍 标量子查询 列子查询 行子查询 表子查询 自连接 通过前面的学习&#xff0c;我们对于连接已经有了一定的理解。而自连接&#xff0c;通俗地去理解就是自己连接自己&#xff0c;即一张表查询多次。…...

day53 动规.p14 子序列

- 1143.最长公共子序列 cpp class Solution { public: int longestCommonSubsequence(string text1, string text2) { vector<vector<int>> dp(text1.size() 1, vector<int>(text2.size() 1, 0)); for (int i 1; i < text1.size(…...

将docker打包成镜像并保存到本地

如果想重装系统&#xff0c;又不想破坏docker里面配好的环境&#xff0c;那么可以将docker镜像打包到本地进行保存。 1. 将docker打包成镜像 命令&#xff1a;docker commit 容器id 镜像名:tag 使用docker ps -a即可查看容器相关信息 docker commit dd25c7c6bf17 zm_cu101:c…...

Harmony数据存储工具类

使用的是mmkv 1、安装mmkv ohpm install @ohos/mmkv2、封装 import{MMKV, SerializeBase} from @ohos/mmkv/*** 数据存储工具类*/ class MMKVUtil{private filePath:string = private cachePath:string = private mmkv:MMKVprivate mmapID:string="MMKV"construct…...

ROS 2官方文档(基于humble版本)学习笔记(一)

ROS 2官方文档&#xff08;基于humble版本&#xff09;学习笔记&#xff08;一&#xff09; 一、安装ROS 2二、按教程学习1.CLI 工具配置环境使用turtlesim&#xff0c;ros2和rqt安装 turtlesim启动 turtlesim使用 turtlesim安装 rqt使用 rqt重映射关闭turtlesim 由于市面上专门…...

【数据结构】十字链表的画法

十字链表的基本概念 有向边又称为弧 假设顶点 v 指向 w&#xff0c;那么 w 称为弧头&#xff0c;v 称为弧尾 顶点节点采用顺序存储 顶点节点 data&#xff1a;存放顶点的信息firstin&#xff1a;指向以该节点为终点&#xff08;弧头&#xff09;的弧节点firstout&#xff1…...

使用rabbitmq进行支付之后的消息通知

订单服务完成支付后将支付结果发给每一个与订单服务对接的微服务&#xff0c;订单服务将消息发给交换机&#xff0c;由交换机广播消息&#xff0c;每个订阅消息的微服务都可以接收到支付结果. 微服务收到支付结果根据订单的类型去更新自己的业务数据。 相关技术方案 使用消息…...

【100天精通python】Day47:python网络编程_Web开发:web服务器,前端基础以及静态服务器

目录 1 网络编程与web编程 1.1 网络编程 1.2 web编程 1.3 前后端交互的基本原理 2 Web开发基础 2.1 HTTP协议 2.2 Web服务器 2.3 前端基础 2.3.1 HTML&#xff08;超文本标记语言&#xff09; 2. 3.2 CSS&#xff08;层叠样式表&#xff09; 2.3.3 JavaScript 2.…...

Web框架Beego

beego简介第一个beego项目beego项目结构分析bee 工具简介beego参数配置beego路由设置beego控制器介绍beego获取参数beego ORMbeego orm高级查询beego 原生sql查询beego 模板语法指南beego模板处理...

Kubernetes(K8s)基本环境部署

此处只做学习使用&#xff0c;配置单master环境。 一、环境准备 1、ip主机规划&#xff08;准备五台新机&#xff09;>修改各个节点的主机名 注意&#xff1a;关闭防火墙与selinux 节点主机名ip身份joshua1 kubernetes-master.openlab.cn 192.168.134.151masterjoshua2k…...

antd5:form组件底层封装库field-form-1.37.0启动

一开始node版本是18.16.0 npm install发现安装依赖成功 npm start发现启动出错 node:internal/crypto/hash:71this[kHandle] new _Hash(algorithm, xofLen);^Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:71:19)…...

深度学习经典检测方法的概述

深度学习经典的检测方法 two-stage&#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 两阶段&#xff08;two-stage&#xff09;是指先通过一个区域提取网络&#xff08;region proposal network&#xff0c;RPN&#xff09;生成候选框&#xff0c;再通过…...

viewpager2导致的mViews下标越界问题

viewpager2种在嵌套一个RecyclerView场景&#xff1a;左右滑动&#xff0c;上下滑动&#xff0c;出现mViews为null问题。 //RecyclerView布局为 new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL) 由于使用viewpager2导致布局缓存的销毁&#xff0c;会…...

无涯教程-JavaScript - NORMSDIST函数

NORMSDIST函数替代Excel 2010中的NORM.S.DIST函数。 描述 该函数返回标准正态累积分布函数。分布的平均值为0(零),标准偏差为1。使用此功能代替标准法线区域的表格。 语法 NORMSDIST (z)争论 Argument描述Required/OptionalZThe value for which you want the distributio…...

Mysql查询(SELECT)

基本查询&#xff1a;SELECT FROM SELECT 查询字段 FROM 表名; SELECT * FROM userinfo; 条件查询&#xff1a;用where表示查询条件 SELECT 查询字段 FROM 表名 WHERE 条件; 模糊查询&#xff1a;like %匹配0或多个字符&#xff0c;一般不用左模糊&#xff08;%放在左边&…...

基于JAVAEE技术的ssm校园车辆管理系统源码和论文

基于JAVAEE技术的ssm校园车辆管理系统源码和论文105 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1.选题背景和意义 背景&#xff1a; 随着第二次工业革命后&#xff0c;内燃机的发明与完善&#xff0c;解…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...