Java Concurrency 2: ThreadPool

华大HC32F460 ADC+DMA高效数据采集实战解析 本文深入解析了华大HC32F460微控制器中ADC与DMA协同工作的高效数据采集方案。通过实战代码演示,详细阐述了如何配置硬件触发、序列扫描及AOS事件联动,实现后台自动采集,从而解放CPU资源,提升系统实时性与可靠性,适用于传感器数据采集、音频处理等多种场景。 阅读详情
基本概念

《设计模式之禅》将对象池作为一种新的设计模式来看待,在重复生成对象的操作影响性能的时候适合将对象池化,这样看线程池算是对象池模式的一个典型应用了,其他应用还有DBCP、C3P0等数据库连接池,实际开发中如果使用对象池,可以用common-pool工具包来辅助实现,方便快捷。

使用线程池的好处:

  • 降低资源消耗
  • 提高响应速度
  • 提高线程的可管理性

工厂类Executors可以建立几种常用的线程池:

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue());
    }

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue());
    }

        public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue()));
    }

另外还有workStealingPool和scheduledThreadPool,其实都是调用了ThreadPoolExecutor类来新建线程池,下面分析下这个类。

ThreadPoolExecutor参数:
先看看jdk源码中对参数的说明:


   /**
     * Creates a new {@code ThreadPoolExecutor} with the given initial
     * parameters.
     *
     * @param corePoolSize the number of threads to keep in the pool, even
     *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
     * @param maximumPoolSize the maximum number of threads to allow in the
     *        pool
     * @param keepAliveTime when the number of threads is greater than
     *        the core, this is the maximum time that excess idle threads
     *        will wait for new tasks before terminating.
     * @param unit the time unit for the {@code keepAliveTime} argument
     * @param workQueue the queue to use for holding tasks before they are
     *        executed.  This queue will hold only the {@code Runnable}
     *        tasks submitted by the {@code execute} method.
     * @param threadFactory the factory to use when the executor
     *        creates a new thread
     * @param handler the handler to use when execution is blocked
     *        because the thread bounds and queue capacities are reached
     * @throws IllegalArgumentException if one of the following holds:<br>
     *         {@code corePoolSize < 0}<br>
     *         {@code keepAliveTime < 0}<br>
     *         {@code maximumPoolSize <= 0}<br>
     *         {@code maximumPoolSize < corePoolSize}
     * @throws NullPointerException if {@code workQueue}
     *         or {@code threadFactory} or {@code handler} is null
     */
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
  • corePoolSize—核心线程数
    核心线程会一直存活,即使没有任务需要处理。当线程数小于核心线程数时,即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交给现有的线程处理。
    核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出。
  • maximumPoolSize—最大线程数
    当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常。
  • workQueue—任务队列
    保存等待执行的任务的阻塞队列,可以选择一下几种:
    • ArrayBlockingQueue
      基于数组的有界阻塞队列,FIFO。
    • LinkedBlockingQueue
      基于链表的阻塞队列,FIFO;静态工厂方法Executors.newFixedThreadPool()即使用该队列。
    • SynchronousQueue
      不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入会一直处于阻塞状态,吞吐量通常会高于LinkedBlockingQueue。静态工厂方法Executors.newCachedThreadPool()即使用该队列。
    • PriorityBlockingQueue
  • keepAliveTime
    当线程空闲时间达到keepAliveTime,该线程会退出,直到线程数量等于corePoolSize。如果allowCoreThreadTimeout设置为true,则所有线程均会退出直到线程数量为0。
  • allowCoreThreadTimeout
    是否允许核心线程空闲退出,默认值为false。
  • queueCapacity
    任务队列容量。从maxPoolSize的描述上可以看出,任务队列的容量会影响到线程的变化,因此任务队列的长度也需要恰当的设置。

任务提交:

  • submit()
    需要返回信息,其内部还是调用的execute()
  • execute()

线程池按以下顺序执行任务:

  • 当线程数小于核心线程数时,创建线程。
  • 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
  • 当线程数大于等于核心线程数,且任务队列已满
    • 若线程数小于最大线程数,创建线程
    • 若线程数等于最大线程数,抛出异常,拒绝任务

参数设置
实际应用场景一般不会直接调用Executors直接这几种线程,而是根据响应需求和系统资源综合考虑,

IO密集型和CPU密集型
我们可以把任务分为计算密集型和IO密集型。
计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等。这种类型的任务越多,花在任务切换的时间就越多,导致CPU执行任务的时间减少。所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。
IO密集型,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度),涉及到网络、磁盘IO的任务都是IO密集型任务。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。

参考:
http://blog.youkuaiyun.com/miclung/article/details/7231553
http://www.cnblogs.com/jinzhiming/p/5120623.html
http://www.blogjava.net/bolo/archive/2015/01/20/422296.html

Seafile搭建以及onlyoffice在线办公 部署seafile docker-compose.yml 如下: 参考此篇文章 version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=db_dev # mysql root的密码,同时修改 seafile的DB_ROOT_PASSWD与这个一致 - MYSQL_LOG_CONSOLE 阅读详情

相关推荐

Materials Studio实战技巧(八)——利用片段库高效构建有机金属配合物

本文详细介绍了在Materials Studio中利用Fragment Browser(片段浏览器)高效构建有机金属配合物的实战技巧。通过调用预置的Metal Templates和Ligands库,用户可以快速搭建如茂金属催化剂等复杂分子骨架,并利用对称性操作精确控制Meso与Rac构型。文章还涵盖了自定义片段库的创建与使用,能显著提升建模效率,适用于计算化学与材料模拟领域的研究者。

wine的专栏 936

Apache Kafka-通过concurrency实现并发消费

文章目录概述CodePOM依赖配置文件生产者消费者单元测试测速结果源码地址 概述 我们要发送的 Code POM依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> &l

小工匠 3万+

运算放大器电路中的T型网络:如何用更小电阻实现高增益并降低噪声?

本文深入解析了运算放大器电路中T型反馈网络的设计与应用。该网络通过三个较小阻值电阻的组合,等效实现高增益,有效规避了传统大反馈电阻带来的显著热噪声问题。文章从数学原理、噪声定量分析到实际设计技巧,系统阐述了如何利用T型网络在实现高增益的同时,显著降低电路噪声并改善整体性能。

banana的博客 318

【RabbitMQ-2】RabbitMQ的并发参数(concurrency和prefetch)

文章目录 1. 环境配置 2. prefetch属性 3. concurrency属性 4. prefetch和concurrency属性 推荐阅读 1. 环境配置 版本信息: JDK:8 SpringBoot 2.1.3.RELEASE RabbitMQ消费端配置 spring: rabbitmq: host: localhost port: 5672 username: guest password: guest listener:

m0_67401545的博客 3006

Python + Google AI 自动修复 Sonar Bug 实践

在工作中总会遇到种种不期而至的需求,比如前段时间突然要修复所有 Sonar Bug,涉及各种琐碎的代码风格问题,包括但不限于语法不规范、废弃注释等问题。这些项目都已经持续开发几年了,Sonar 上的问题层出不穷,各种问题已经累积到了上万个,手动修复不但费时费力,而且过程异常枯燥。

子洋 Blog 2415

【人工智能】人工智能基础概念、流派、发展史

人工智能初衷就是让计算机能够像人类一样具有自我思考、自我学习、自我决策的能力。依据百度百科上对人工智能定义:人工智能是研究、开发用于模拟、扩展和延伸人的智能的理论、方法、技术及应用系统的一门新的技术学科。人工智能是研究使计算机来模拟人的某些思维过程和智能行为的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。

WEL测试 1882

RabbitMQ的并发参数(concurrency和prefetch)

版本信息: JDK:8 SpringBoot 2.1.3.RELEASE RabbitMQ消费端配置: spring: rabbitmq: host: localhost port: 5672 username: guest password: guest listener: simple: # acknowledge-mode: manual # 手动确定(默认自动确认) concurrency: 1 # 消费.

海子@幸福人 2万+

手把手教你学Simulink——基于Simulink的无感FOC(滑模观测器+PLL)实战

摘要: 本文详细介绍了基于Simulink的无感FOC(滑模观测器+PLL)实现方法。主要内容包括:1)SMO+PLL原理,通过滑模观测器估算反电动势,结合PLL抑制抖振;2)系统架构,替代编码器信号;3)Simulink建模流程,涵盖Clarke变换、SMO离散化实现、PLL设计等关键步骤;4)参数整定指南和工程实践要点,如启动策略和故障处理。该方法具有成本低、可靠性高的优势,适用于家电、电动车等场景,仿真结果显示角度误差±5°,速度动态跟随良好。文章还提供了调试建议和常见问题解决方案。

MHD0815的博客 136

深入浅出 Java Concurrency (2): 原子操作 part 1

占位

练好本领,报国杀敌 287

AI穿透式智慧粮仓

本报告基于 2025-2026 年全国多地智慧粮储实践案例,系统分析了 "AI + 穿透式" 智慧粮储体系的技术架构、AI 算法应用、提质增效成效、区域差异化特点及未来发展趋势。该体系通过多模态感知、智能算法与管控平台的深度融合,实现粮食存储全流程精准感知、智能预警与科学调控,显著降低储粮损耗与运营成本,大幅提升储粮安全水平与管理效率。报告梳理了各地差异化实践路径,提出针对性发展建议,为推动我国粮食仓储高质量发展、筑牢国家粮食安全防线提供参考。

reset2021的博客 229

【云原生技术】sonar的官方web接口,获取质量阀结果的接口

以下是一个示例思路,说明如何调用 SonarQube 的质量阀查询接口并在前端展示“哪些条件没过”。假设前端使用 AJAX 或 fetch 从后端接口拿到 SonarQube 返回的 JSON(或直接前端请求 SonarQube API),前端再把解析结果展示给用户。测试覆盖率 (Coverage) 当前仅有 60%,未满足最低 80% 的要求,需要补充测试或优化以提升覆盖率。接口),就会返回相应的质量阀状态信息;里使用它来查询当前质量阀(质量门)的状态。,你用它即可获取该次分析的质量阀状态。

weixin_46453070的博客 1279

Java并发编程(Java Concurrency)(2)- 多线程的好处

摘要:这是翻译自一个大概30个小节的关于Java并发编程的入门级教程,原作者Jakob Jenkov,译者Zhenning Lang,转载请注明出处,thanks and have a good time here~~~(希望自己不要留坑)

小狼碎碎念的博客 1130

基于 MATLAB 的 FastICA 算法实现语音信号盲分离

FastICA 算法通过最大化信号的非高斯性,找到独立成分,从而实现信号的分离。这些混合的信号被称为盲源信号,我们希望通过分析混合信号,将它们分离出来以便进行进一步的处理和分析。FastICA 是一种常用的盲源信号分离算法,它基于统计学原理,通过寻找独立成分来实现信号的分离。FastICA(独立成分分析)是一种常用的盲源信号分离算法,在语音和图像处理领域都有广泛的应用。本文将介绍如何使用 MATLAB 实现 FastICA 算法来实现语音信号的盲分离,并提供相应的源代码。FastICA 算法原理。

学习使你进步。 2024

Loom虚拟线程压测对比报告(200万并发实测):传统ThreadPool vs Structured Concurrency性能断层解析

Java项目Loom响应式编程转型指南最佳实践:基于200万并发压测,对比ThreadPool与Structured Concurrency性能断层,揭示虚拟线程在高并发IO密集型场景下的资源利用率与吞吐量优势。涵盖迁移路径、异常处理与监控要点,值得收藏。

VarFlow的博客 150

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

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

java 浅析对象池ThreadPool

回忆一下java的线程池的知识。 一个app中可能因为需要会开很多个线程去执行任务,也许为图省事直接new 一个thread,其实它同时会带来很大的弊端,如内存过度消耗,创建和消耗对象费时费CPU资源等 线程池可以看做装载线程的容器,当打开一个app时,在application中可以声明并创建一个线程池来管理整个app的线程,因为一个应用程序最多只能有一个线程池。 那么为什么要创

蒙奇奇有大大的梦想 626

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java数组整组处理_java – 使它漂亮:同时处理数组

我想将这个线性循环转换为并发循环:for(Item item : ItemList) {processItem(item);}这真的是最短的方式吗?class Worker implements Runnable {Item item;Worker(Item item) {this.item = item;}public void Run() {processItem(item);}}Execut...

weixin_42128141的博客 208

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Basic Of Concurrency(十九: 线程池)

线程池是并发编程比较典型的知识点了.当你想在应用中限制同一时间并行执行线程数量的时候可以使用线程池.对比通过创建新线程的方式线程池有显著的性能提升且每一个线程都能获得一定大小的内存空间用作线程栈存储. 可以将任务通过传入线程池来代替创建新线程的方式让任务并行执行.当线程池有闲置线程时,任务将会被分配给这部分线程执行.在线程池内部任务通过插入阻塞队列的方式来让闲置线程取出执行.当有新任务到达时,将会...

weixin_34335458的博客 128

知识库--Concurrency+ThreadPool+Executors(79)

阻塞系数=0.9 四核处理器public abstract class AbstractNAV { public static Map<String, Integer> readTickers() throws IOException { final BufferedReader reader = new BufferedReader(new

qfzhangwei的专栏 307

深入浅出 Java Concurrency (28): 线程池 part 1 简介[转]

从这一节开始正式进入线程池的部分。其实整个体系已经拖了很长的时间,因此后面的章节会加快速度,甚至只是一个半成品或者简单化,以后有时间的慢慢补充、完善。 其实线程池是并发包里面很重要的一部分,在实际情况中也是使用很多的一个重要组件。 下图描述的是线程池API的一部分。广义上的完整线程池可能还包括Thread/Runnable、Timer/TimerTask等部分。这里只介绍主要的和高级的API以...

weixin_30332705的博客 131

励精图治---Concurrency---ThreadPoolExecutor最详

心情不好,不适合写博客。今天开篇。周末完成它。唉我的妈呀。这个世界怎么了?

王学明 766

【Java】已解决java.util.concurrent.TimeoutException异常

java.util.concurrent.TimeoutException是Java并发编程中常见的一个异常,它通常发生在使用Future或FutureTask等并发工具时,当我们在指定的超时时间内没有获取到结果时,就会抛出此异常。在这个例子中,由于我们设置的超时时间为1秒,而任务实际需要5秒才能完成,所以在调用future.get(1, TimeUnit.SECONDS)时会抛出TimeoutException。下面,我们将探讨如何解决这一问题。在这个例子中,我们将超时时间设置为6秒,足够任务完成。

屿小夏.的知识博客 2723

C#多线程编程:核心概念与实战技巧

多线程编程是现代软件开发中的关键技术,它通过将任务分解为多个并行执行的线程,显著提升程序性能和响应速度。在C#中,System.Threading命名空间提供了完整的线程操作支持,包括Thread类、线程池和Task等不同层级的实现方式。理解线程同步机制如lock、Monitor和Semaphore对于避免竞态条件至关重要。实际开发中,合理使用ConcurrentDictionary等线程安全集合能有效简化并发编程。在工业监控、金融交易等实时系统中,多线程技术可以实现8倍以上的性能提升,但需注意线程不是越多

390

Java项目Loom化不是选择题:从JDK 21 LTS强制启用VirtualThread看未来3年技术淘汰倒计时

Java项目Loom化转型迫在眉睫:本《Java项目Loom响应式编程转型指南入门到精通教程》覆盖JDK 21 VirtualThread落地实践、传统线程池迁移策略与响应式编程协同方案,适用于高并发微服务与IO密集型系统,显著降低资源开销、提升吞吐量,值得收藏。

SimCompile的博客 374

Java线程基础:并发编程核心

在当今的软件开发领域,高并发已经成为衡量系统性能的重要指标。Java作为一门广泛应用于企业级应用开发的语言,其并发编程能力尤为关键。线程作为Java实现并发编程的基本单位,理解线程的基础知识对于深入掌握Java并发编程至关重要。想象一下,在一个大型在线购物平台中,用户同时进行商品浏览、下单、支付等操作,这些操作需要快速响应,以保证用户体验。这就需要系统具备高并发处理能力,而线程是实现这一目标的关键。然而,在深入探讨线程的细节之前,我们首先需要了解线程的基本概念。

JavaCodePro的博客 774

java callable future说明和使用场景

找到一个很好的场景说明,语法配合场景,学起来用起来才是最快最好的。在本文最后,在补充另外一个场景。 原文地址为:https://dzone.com/articles/java-callable-future-understanding 下面为该网页的拷贝。 In Java multithreading programs, we extensively use Java Callable an...

大仕忆的博客 1822

Java 四种线程池

package ExecuteServiceTest; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeU...

qq_25079615的博客 162
上一篇: Design Pattern 6: Adapter Pattern
下一篇: Java JVM 2: 锁优化
HackerDotCn
博客等级 码龄11年 3粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值