记一次使用Future+ThreadPool的多线程卡死问题

C++多线程编程实战:从std::thread到线程池的完整指南 并发编程是现代软件开发的核心概念,它允许程序同时执行多个任务,从而充分利用多核处理器资源,提升系统吞吐量和响应速度。其基本原理是通过创建多个执行流(线程)来并行处理任务,这些线程共享进程的内存空间,但拥有独立的执行栈。在C++中,多线程技术价值显著,能够解决I/O阻塞、计算密集型任务并行化以及高并发服务器等场景下的性能瓶颈。应用场景广泛,包括网络服务器、图形界面程序、数据处理和科学计算等领域。本文聚焦于C++多线程编程的实战方法,系统梳理了从标准库的std::thread、平台特定的pthread和Crea 阅读详情

使用带有返回值的线程池时,需要留意关闭线程池后,及时处理还在等待线程返回的逻辑

复现代码:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Demo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        List<Future> futures = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            futures.add(executorService.submit(new SubClass(i)));
        }
        // 这里的get()方法会等待【线程0】结束并拿到返回值
        System.out.println(futures.get(0).get());
        // 当【线程0】结束时我们强制关闭线程池
        executorService.shutdownNow();
        // 这时如果在程序的其他位置还在等待线程结束,就会导致程序卡死
        System.out.println(futures.get(8).get());
    }
     public static class SubClass implements Callable<String> {
        int num;
        public SubClass(int num) {
            this.num = num;
        }

        @Override
        public String call() {
            System.out.println(Thread.currentThread().getName()+ " " + num +" start");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException ignore) {
            }
            System.out.println(Thread.currentThread().getName()+ " " + num +" stop");
            return "success-"+num;
        }
    }
}
C++任务调度器实战:从STL多线程到Boost库的综合应用 任务调度是并发编程中的核心概念,它通过协调多个任务的执行顺序和资源分配,提升系统吞吐量和响应速度。其原理基于生产者-消费者模型,利用任务队列和线程池实现任务的异步执行与资源复用。在C++工程实践中,任务调度器技术价值显著,能有效管理计算密集型或I/O密集型任务,优化多核CPU利用率。通过结合STL的std::packaged_task、std::future进行任务包装与结果传递,并运用多线程库的mutex和condition_variable实现线程安全同步,开发者可以构建高性能的并发基础组件。本文以中型 阅读详情

相关推荐

C++线程池实战:从生产者消费者模型到生产级并发编程

并发编程是现代软件开发的核心技术之一,旨在通过多线程执行提升程序性能。其基本原理是创建多个执行流,通过任务调度与同步机制实现并行处理。在C++等系统级语言中,并发编程的技术价值尤为突出,它直接关系到程序的资源利用率、响应速度和系统稳定性。典型的应用场景包括网络服务器、数据处理流水线和高性能计算等。在这些场景中,频繁创建销毁线程会带来巨大开销,因此线程池应运而生,它通过复用线程资源、管理任务队列来优化性能。本文聚焦于C++线程池的实现,深入探讨了其核心架构——基于生产者消费者模型的任务队列设计,并详细解析了如

weixin_30820077的博客 311

C++多线程异常处理:基于std::promise/future的安全传播机制

在并发编程中,异常处理是确保程序健壮性的关键技术。C++标准库提供了强大的异常机制,但在多线程环境下,异常无法自动跨越线程边界传播,这可能导致线程静默终止或资源泄漏。其核心原理是通过std::promise和std::future这对工具,将子线程中抛出的异常捕获并存储,然后在主线程中重新抛出,实现异常的跨线程安全传递。这种机制的技术价值在于将异步错误处理同步化,使得主线程能够感知并处理子线程的故障,从而提升程序的可靠性和可维护性。在工程实践中,这一技术广泛应用于后台服务、并行计算框架和GUI应用等场景,确

ithome 468

C++线程池实战:从核心原理到工业级实现

线程池是一种管理并发任务执行的核心设计模式,其核心原理在于预先创建并维护一组工作线程,通过共享任务队列来复用线程资源,从而避免频繁创建和销毁线程带来的性能开销。这一技术价值在于显著提升高并发场景下的系统吞吐量和响应速度,尤其适用于服务器应用、数据处理等需要处理大量短小任务的场景。通过合理运用互斥锁、条件变量等同步原语,可以构建出线程安全、资源高效管理的并发组件。本文聚焦于C++线程池的工业级实现,深入剖析了任务队列设计、异常处理、优雅关闭等关键问题,并探讨了有界队列与无界队列的选择、Future机制集成等高

weixin_34378767的博客 407

java futuretask get reject异常_Future.get卡死,线程池的一个坑点

如果线程池的拒绝策略设置成DiscardPolicy或者DiscardOldestPolicy,通过Future获取执行结果,可能导致线程会一直阻塞。问题复现// 创建一个单线程,拒绝策略时 DiscardPolicyprivate final static ThreadPoolExecutor executorService = newThreadPoolExecutor(1, 1, 1L, T...

weixin_31451231的博客 2408

C++多线程面试核心:从原子操作到线程池的实战解析

并发编程是现代软件开发的基石,它允许多个任务同时执行以提升系统吞吐量和响应速度。其核心原理在于对共享资源的安全访问与线程间的高效协作,这直接关系到程序的正确性与性能。在C++中,通过`std::thread`、`std::mutex`等标准库组件实现并发,其技术价值在于充分利用多核CPU的计算能力,构建高性能的后台服务、游戏服务器或实时系统。典型的应用场景包括实现线程安全的单例模式、设计生产者-消费者队列以解耦模块,以及构建线程池来避免频繁创建销毁线程的开销。本文聚焦于**双重检查锁定**和**虚假唤醒**

weixin_30765505的博客 328

C++异步编程方案深度对比:从线程池到协程的实战选型指南

异步处理是现代高并发系统的核心技术,其核心思想是在等待I/O操作时不阻塞CPU,从而提升系统吞吐量和资源利用率。其实现原理主要围绕事件驱动模型,通过回调、Future/Promise或协程等机制,在I/O就绪时通知程序继续执行。这项技术的核心价值在于能够以少量线程支撑海量并发连接,是构建高性能网络服务器、游戏后端、金融交易系统等I/O密集型服务的基石。在实际应用场景中,开发者需要根据任务类型(CPU密集型或I/O密集型)、性能要求及团队技术栈,在多种方案中做出选择。本文聚焦于C++生态,系统性地横向对比了包

WGH100817的博客 428

Future多线程导致系统阻塞

多线程阻塞

slhero的博客 699

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 709

Java基础浅聊Future带来的异步优点和缺点

简单的解释了什么叫做异步回调任务,以及再java中如何使用。

u011863822的博客 1800

PCIe学习笔记(一)-------1.3 PCIe数据包(TLP,DLLP,PLP)

1,PCIe的层次结构 PICe设备在硬件电路上可以分为三个层次结构:事务层(Transaction Layer)、数据链路层(Data Link Layer)、物理层(Physical)。每一个层次又可以分为两个部分,分别为处理发送和处理接收的部分。 也可以分为四个层次,将事务层以上的层次称为软件层(Software Layer)。 2,PCIe数据包 前面已经说过PCIe之间是以数据包的形式来传输数据的,协议共定义了3类数据包。与处理层相关的是处理层数据包(TLP),与数据链路层相关的是数据

llxxyy507的博客 2万+

Android 的端智能学习路径

基础层:先补齐 Android 进阶(JNI / 性能优化)和 AI 基础概念,无需深入算法开发;核心层:掌握 TFLite 的模型加载、推理、量化,能完成基础端侧推理;落地层:聚焦实战场景(图像 / OCR / 语音),解决工程化问题(模型管理、异常处理);优化层:通过模型量化、硬件加速、工程优化,提升推理性能和用户体验。

hqiangtai的博客 344

线程死锁,使用Future捕获死锁超时

经典的死锁例子,在以后的编程中可以将不确定是否死锁的程序加上超时判断。import java.util.concurrent.*;public class DeadLock implements Runnable { public int flag = 1; //静态对象是类的所有对象共享的 private static Object o1 = new Object(

jiangchengzi_的博客 1325

基于Mind+、MOTT实现人工智能

@基于Mind+、MOTT实现人工智能 人工智能实验 一、实验目的及要求 【一】实现人脸识别 【二】实现云数据库应用 【三】实现测温数据mqtt上传至物联网云平台 二、实验原理与内容 基于二哈实现多人人脸学习和识别 基于TinywebDB实现云数据库应用 基于EasyIoT实现mqtt数据上传。 三、实验软硬件环境 硬件:掌控板 软件:Mind+ 四、实验过程(实验步骤、记录、数据、分析) 1.基于二哈实现多人人脸学习和识别 ①在Mind+扩展上的传感器选项选择HUSKYLENS AI 摄像头 ②配置哈士

weixin_44606930的博客 2374

如何解决多线程卡死问题?四招教你轻松应对!

多线程大家都用过,可以让一个程序同时执行多个任务,提高效率和性能,一个人干的慢,三个人干。但是,多线程也带来了一些问题和挑战,比如等问题,三个人抢一碗米饭,没有个规矩肯定要打架的。这里我介绍一种可能出现的多线程问题:如果一个线程在执行过程中一直卡住,线程不释放最终导致线程耗尽怎么办。这是前一阶段对接外部系统时遇到的一个问题,对方提供了个SDK,我们集成后用他们的netty的方式建立连接,推送相关数据,但是呢这个推送不能阻塞业务,所以我们采用异步推送,搞了个线程池,随取随还,如图后来就发现有一个。

洛雪 9913

从零开始:用LabVIEW和ModbusTCP协议,像搭积木一样连接Delta PLC

本文详细介绍了如何利用LabVIEW的图形化编程环境和ModbusTCP工业协议,快速连接Delta PLC实现数据通信。通过模块化配置和实战案例,指导读者无需编写复杂代码即可完成寄存器读取、多数据类型处理及系统监控,显著提升工业自动化项目的开发效率与部署速度。

n8m7b6v5c4的博客 697

POWER(十一)charge pump原理

电荷泵是一种基于电容充放电原理的DC-DC转换电路,通过开关控制实现电压转换,包括升压、降压和负压输出。其核心是利用电荷守恒原理,通过电容存储和转移电荷来改变输出电压。典型拓扑结构包括倍压电路和多阶升压电路,具有结构简单、体积小等优势。关键参数包括转换效率、输出电流能力和开关频率,适用于芯片供电、显示屏驱动等低功耗场景。LVDS部分补充说明了自举电路在驱动电路中的应用及其自同步特性。

zhlwsh的博客 2810

async/future/promise本质:跨语言异步状态机协议

异步编程不是简单的多线程或回调嵌套,而是基于状态机的任务调度范式。async是挂起点注册器,future是只读状态观察者,promise是单向状态发射器,packaged_task是可迁移的调用单元——四者共同构成跨C++、JavaScript、Java、Rust等语言的通用异步契约。其技术价值在于解耦执行与等待、避免线程阻塞、实现高并发I/O复用,并支撑Vue响应式更新、Netty事件循环、线程池任务分发等关键场景。理解这组组件的状态流转规则(如promise只能设置一次、future.get()具破坏性

weixin_30274627的博客 312

以宠辱之戒写 SAP Fiori Elements,把标准能力当成身体,把扩展冲动当成大患

SAP Fiori Elements开发中常面临业务方追求"独特页面"的压力,但过度自定义会破坏框架价值。老子"宠辱若惊"的智慧提醒开发者:不应因用户称赞或批评而动摇架构原则。标准模板的价值在于确保业务语义、交互规范和后端服务的一致性。扩展应遵循官方API,将业务逻辑放在ABAP/CDS层而非前端控制器。成熟项目会平衡标准与定制,使用annotation表达UI行为,仅在必要时通过受支持的extension points进行增强,保持系统的长期可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 998

C++11 std::thread 多线程编程:从基础原理到线程池实战

并发编程是现代软件开发的核心技术,旨在解决程序执行效率与响应性问题。其基本原理是通过创建多个独立的执行流(线程),使程序能够同时处理多个任务,从而充分利用多核CPU的计算能力。这项技术的核心价值在于提升计算密集型任务的吞吐量,并改善交互式应用程序的用户体验。在实际工程中,多线程技术广泛应用于高性能服务器、图形图像处理、实时数据处理等场景。要实现安全高效的并发,必须掌握线程同步机制,如互斥锁(mutex)和条件变量(condition_variable),以避免数据竞争和死锁。本文以C++11引入的 `std

weixin_30861797的博客 330

SEGGER Embedded Studio初体验

先楫HPM5E00EVK开发环境搭建

hywing's blog 1109

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java中的并发编程解锁多线程的强大潜力

CountDownLatch`、`CyclicBarrier`和`Semaphore`等同步器则能够精确控制多个线程的执行时序和资源访问,实现复杂的协调逻辑。`CompletableFuture`更提供了丰富的组合式异步编程API,支持多个异步任务的流水线操作、组合和聚合,使得编写非阻塞的、复杂的异步逻辑变得清晰和优雅,充分释放了系统的处理能力。从基本的线程管理到高级的锁优化和异步处理,Java提供的这套完整的工具集和内存模型,为应对当今复杂的计算需求提供了坚实的基础和无限的可能性。

m0_37126428的博客 260

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python zipfile 库密码破解效率优化:3 种多线程方案与性能对比

本文详细探讨了使用Python zipfile库进行密码破解时的效率优化方法,对比了三种多线程方案(ThreadPool、ProcessPool和joblib)的性能差异。通过实际测试数据展示了多进程方案在破解速度上的显著优势,并提供了字典优化和性能调优的实用技巧,帮助开发者高效处理加密ZIP文件。

weixin_34015336的博客 496

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++多线程并行化矩阵相加:从原理到实战的性能优化指南

并行计算是现代高性能计算的核心技术,其基本原理是将大规模计算任务分解为多个独立子任务,利用多核处理器同时执行,从而显著提升程序运行效率。在C++开发中,多线程是实现并行计算的主要手段,通过合理设计任务划分与线程同步机制,可以充分发挥硬件性能。矩阵相加作为典型的可并行化操作,其优化对于图像处理、科学计算等内存带宽受限型任务具有重要价值。本文以矩阵相加为例,深入探讨了按行划分、线程池等关键技术,并分析了负载均衡与数据竞争等常见问题,为处理大规模数据计算提供了实用的工程实践方案。

lvwenwen 473

C++线程池实现:从原理到生产环境级代码详解

并发编程是现代软件开发的核心技术,通过多线程并行执行任务来提升程序性能。其基本原理在于利用操作系统提供的线程机制,将任务分解并由多个执行单元同时处理。在C++等系统级语言中,线程池技术尤为重要,它能有效管理线程生命周期,避免频繁创建销毁线程带来的性能开销,并防止系统资源耗尽。线程池的核心价值在于实现资源的“池化”复用,通过预创建并维护一组工作线程,结合任务队列进行调度,显著提升高并发场景下服务器和计算密集型应用的吞吐率与稳定性。本文以C++11标准线程库为基础,深入探讨如何实现一个支持任务提交、返回值获取和

weixin_34049948的博客 481

Python多线程编程实战:从I/O密集型任务到线程池管理

并发编程是提升程序性能、充分利用计算资源的核心技术之一,其核心原理在于通过多任务执行来减少等待时间,从而提高整体吞吐量。在Python中,多线程技术特别适用于I/O密集型场景,如网络请求、文件读写等存在大量等待的操作,能有效提升程序效率。然而,由于全局解释器锁(GIL)的存在,多线程对于纯CPU密集型任务(如数值计算)的加速效果有限,此时需考虑多进程方案。在实际工程实践中,通过threading模块创建和管理线程,结合锁(Lock)、队列(Queue)等同步机制协调线程间通信,并利用ThreadPoolEx

weixin_33911824的博客 410

C++线程池实现:从生产者-消费者模型到高性能并发编程

并发编程是现代软件开发的核心技术之一,其核心原理是通过多线程并行执行任务来提升程序性能。在C++高性能服务端开发中,线程池作为关键基础设施,基于生产者-消费者模型实现任务调度,能有效避免频繁创建销毁线程的开销。从技术价值看,线程池通过任务队列管理、工作线程组和同步原语(如互斥锁与条件变量)的协同,实现了资源复用和负载均衡,显著提升系统吞吐量。应用场景广泛覆盖HTTP服务器、游戏服务器等需要处理高并发短期任务的领域。本文聚焦C++线程池的手动实现,深入探讨std::thread、std::mutex和std:

weixin_33794672的博客 349
上一篇: 小记:executor.shutdownNow无法关闭线程池,线程池卡死
下一篇: java使用nio写【中文与ascii字符(abc123)混合】时,出现不可见字符,其ascii码为0
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值