Java Concurrency 2: ThreadPool

SAP CEWB 高效批量调整工艺路线与BOM的实战指南 本文详细介绍了SAP CEWB工具在批量调整工艺路线与BOM中的高效应用。通过实战案例和操作指南,帮助制造业企业快速掌握批量修改技巧,显著提升工作效率,避免手工操作带来的错误和耗时。特别适合需要频繁更新工艺路线和BOM的企业用户。 阅读详情
基本概念

《设计模式之禅》将对象池作为一种新的设计模式来看待,在重复生成对象的操作影响性能的时候适合将对象池化,这样看线程池算是对象池模式的一个典型应用了,其他应用还有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

【AI大模型应用开发实战】大型语言模型评估指南白皮书(LLM Eval) 近年来,大型语言模型(LLM)在自然语言处理领域取得了重大进展,例如 GPT-3 和 Chat-GPT。这些模型经过大型数据集的训练,在文本相关任务中表现出卓越的能力,甚至超越了人类。本文将简要介绍如何验证 LLMs 性能的评估指标。自然语言处理(NLP)是人工智能的一个领域,涉及计算机和人类语言之间的交互。NLP 的基本任务之一是语言建模 (LM),它涉及构建统计模型来分析和生成自然语言。LM 已成为推进机器语言智能的关键方法,使机器能够执行机器翻译、情感分析和对话系统等任务。 阅读详情

相关推荐

IAR安装成功的关键:STM32设备支持文件导入方法

IAR安装常卡在设备支持缺失这一步——尤其对STM32新手,没导入对应芯片包,编译直接报错。实测发现,必须通过IAR的Tools→Options→IDE→Configuration→Device Support手动加载STM32设备支持文件,否则新建工程时连芯片型号都选不到。IAR安装是否顺利,往往就差这一步。

weixin_42527589的博客 680

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

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

小工匠 3万+

百度无人车ApolloAuto使用入门

1.安装原版ubuntu 14.04 http://www.ubuntu.org.cn/download/alternative-downloads 2.安装对应ubuntu 14.04的indigo版ROS http://wiki.ros.org/indigo/Installation/Ubuntu 3.安装Apollo Kernel https://github.co

ss910的博客 3万+

【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

软件项目质量管理

识别项目中涉及质量管理的不同角色,如项目经理、质量经理、测试人员等,明确每个角色的职责和任务,包括负责哪些质量管理活动和决策。1、编制软件项目的质量管理计划,包括确定项目的质量标准和要求,以及制定质量控制和质量保证策略等。2、编制软件项目的质量管理计划,包括确定项目的质量标准和要求,以及制定质量控制和质量保证策略等。测试用例表是质量控制过程中的关键工具,确保所有功能和场景都被验证,减少项目中的缺陷。1、理解项目质量管理的基本过程,包括质量计划、质量保证、质量控制和质量改进;明确质量管理活动中的角色和职责。

weixin_51996255的博客 1258

Appstore开发者必读:3.2(f)违规预警与高效申诉指南

本文为AppStore开发者提供了应对3.2(f)违规通知的完整指南。文章深度解析了3.2(f)条款下的隐瞒性、关联性与真实性违规类型,并提供了黄金48小时内的自查、申诉信撰写与提交全流程策略。同时,文章强调遵循App Review Guidelines,建立内部合规清单与保持账号独立,是预防违规、维护开发者账号安全的关键。

weixin_29214559的博客 272

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万+

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

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

占位

练好本领,报国杀敌 287

OSPF的7种状态,DR与BDR的基本概念,1、2、3、4、5、7类LSA解析,Stub、NSSA、Totally Stub、Totally NSSA的基本概念与配置

OSPF的7种状态,DR与BDR的基本概念,1、2、3、4、5、7类LSA解析,Stub、NSSA、Totally Stub、Totally NSSA的基本概念与配置

weixin_72194028的博客 3008

BlockUI专栏目录

BlockUI是一个设计NX对话框的工具,是官方推荐使用的对话框制作方法,能够与NX自身风格相统一,并且在实际开发中经常被使用。BlockUI可以帮助用户快速创建NX对话框,支持多种控件类型,如按钮、文本框、标签等。通过使用BlockUI,用户可以轻松地自定义对话框的布局、样式和交互行为。此外,BlockUI还提供了一些高级功能,如动态更新、条件显示和事件处理等,以帮助用户创建更加复杂和灵活的对话框。本专栏讲述了使用BlockUI制作NX对话框的方法,介绍了每个控件的功能,并且分享一些常用操作的源码。

王牌飞行员_里海的博客 1632

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

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

小狼碎碎念的博客 1130

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

VarFlow的博客 150

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java 浅析对象池ThreadPool

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

蒙奇奇有大大的梦想 626

VB摄像头监控

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

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

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、付费专栏及课程。

余额充值