ThreadPoolExcutor(线程池)

ThreadPoolExecutor(二)——execute 1.execute方法 /** * Executes the given task sometime in the future. The task * may execute in a new thread or in an existing pooled thread. * * If the task cannot be submitted for 阅读详情

1、概念:
     用于管理java的多线程。线程的生命周期包括创建、就绪、运行、阻塞、销毁,当有大量的线程任务需要创建时,内存的开销就大了,此时,使用线程池,在一定程度上能够很好的缓解线程的大开销。
2、优势:
     (1)降低资源消耗。通过重复利用已创建的线程降低线程创建、销毁线程造成的消耗。
     (2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
     (3)提高线程的可管理性。线程是稀缺资源,如果入限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。
3、线程池的创建:
        new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler)
     corePoolSize:      线程池维护线程的最少数量 (core : 核心)
     maximumPoolSize:   线程池维护线程的最大数量
 
     keepAliveTime:     线程池维护线程所允许的空闲时间
     unit:   
            线程池维护线程所允许的空闲时间的单位
     workQueue:
          线程池所使用的缓冲队列
     handler:   
         线程池对拒绝任务的处理策略
4、添加任务到线程池
      通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
    当一个任务通过execute(Runnable)方法欲添加到线程池时:
    如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
    如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
    如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
    如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
    也就是:处理任务的优先级为:
    核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
    当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
    unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
     workQueue常用的是:java.util.concurrent.ArrayBlockingQueue
     handler有四个选择:
          ThreadPoolExecutor.AbortPolicy():     抛出java.util.concurrent.RejectedExecutionException异常
          ThreadPoolExecutor.CallerRunsPolicy():     
重试添加当前的任务,他会自动重复调用execute()方法
          ThreadPoolExecutor.DiscardOldestPolicy():     抛弃旧的任务
          ThreadPoolExecutor.DiscardPolicy():     抛弃当前的任务
5、线程池的使用场合:     
     (1)单个任务处理的时间比较短;
     (2)需要处理的任务数量大;
6、线程池的应用举例:
package hh;
import java.io.Serializable;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExcutorDemo {
     private static int produceTaskSleepTime = 5;
     private static int consumeTaskSleepTime = 5000;
     private static int produceTaskMaxNumber = 20; //定义最大添加10个线程到线程池中
     public static void main(String[] args) {
            //构造一个线程池
           ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3,
                     TimeUnit. SECONDS, new ArrayBlockingQueue<Runnable>(3),
                      new ThreadPoolExecutor.DiscardOldestPolicy());
            for( int i=1; i<= produceTaskMaxNumber;i++){
                 try {
                      //一个任务,并将其加入到线程池
                     String work= "work@ " + i;
                     System. out.println( "put :" +work);
                      threadPool.execute( new ThreadPoolTask(work));
                      //便于观察,等待一段时间
                     Thread. sleep(produceTaskSleepTime);
                } catch (Exception e) {
                      e.printStackTrace();
                     }
                }
     }
     /**
     * 线程池执行的任务
     * @author zhu
     */
     public static class ThreadPoolTask implements Runnable,Serializable{
            private static final long serialVersionUID = 0;
            //保存任务所需要的数据
            private Object threadPoolTaskData;
           ThreadPoolTask(Object works){
                 this. threadPoolTaskData =works;
           }
            public void run(){
                 //处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句
                System. out.println( "start------"+threadPoolTaskData );
                 try {
                      //便于观察,等待一段时间
                     Thread. sleep(consumeTaskSleepTime);
                     } catch (Exception e) {
                            e.printStackTrace();
                           }
                 threadPoolTaskData = null;
                }
            public Object getTask(){
                 return this. threadPoolTaskData;
                }
     }
}

ANSYS 2022R2 安装教程:系统准备、许可证配置与故障排查 ANSYS 是面向工程仿真的多物理场商业软件平台,其安装远非普通应用软件的图形化向导流程,而涉及操作系统版本、运行库精确版本、硬件虚拟化支持、许可证服务架构等系统级配置。理解 ANSYS License Manager 的服务机制与端口依赖、掌握 Visual C++ 和 .NET Framework 的启用逻辑,是保障 Fluent、Mechanical、HFSS 等求解器稳定调用的基础。该技术栈广泛应用于高校教学、航空航天结构分析、电子设备电磁兼容仿真等场景。本指南聚焦 ANSYS 2022R2 版本在 阅读详情

相关推荐

射频工程师必须了解的S参数四项要点

本文围绕单端 6 英寸走线的 S 参数展开深入分析,核心包含四项关键要点:低频下导线电学长度远小于信号波长,S11 呈大负分贝值、S21 接近 0 分贝;端口与走线的阻抗不匹配引发反射叠加,形成 S11 首个峰值(对应传输线四分之一波长频率);S21 相位可作为一致性检查依据,其 90° 相位差与 S11 峰值吻合;理想建模中 S11 峰值随频率上升因损耗下降,实际测量因连接器等阻抗不连续性,S11 会出现振荡上升。分析依托 Keysight ADS 工具与电磁求解器原理,为 S 参数解读提供科学支撑。

一只豌豆象的博客 1284

ThreadPoolExcutor详解

1、概念:      用于管理java的多线程。线程的生命周期包括创建、就绪、运行、阻塞、销毁,当有大量的线程任务需要创建时,内存的开销就大了,此时,使用线程池,在一定程度上能够很好的缓解线程的大开销。 2、优势:      (1)降低资源消耗。通过重复利用已创建的线程降低线程创建、销毁线程造成的消耗。      (2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

xiaoliuhu的专栏 2353

图像调整亮度饱和度 c语言,【C#/WPF】调节图像的HSL(色相、饱和度、明亮度)...

先说概念:HSL是一种描述颜色的方式(其他颜色描述方式还有大家熟悉的RGB值)。HSL三个字母分别表示图像的Hue色相、Saturation饱和度、Lightness明亮度。需求:制作一个面板,包含三个滑动条,拖动滑动条可以修改目标图片的HSL值。即模仿PS中类似的功能,如下图:方案一:遍历所有像素点,修改每个点的HSL值。前台界面:一个Image控件显示目标图片,一个Button按钮点击一下降低...

weixin_39935777的博客 1155

ThreadPoolExecutor详解

一、ThreadPoolExecutor类讲解 1、线程池状态: 五种状态: 线程池的状态 说明 RUNNING 允许提交并处理任务 SHUTDOWN 不允许提交新的任务,但是会处理完已提交的任务 STOP 不允许提交新的任务,也不会处理阻塞队列中未执行的任务, 并设置正在执行的线程的中断标志位 TIDYING .

赶路人儿 11万+

vue3的面试题

vue3的面试题

jiang7701037的博客 6265

mcgs数据查表功能,用于大量数据对比查找对应数据,减少PLC代码

mcgs脚本实现数据查表功能

qq_24866535的博客 3270

线程池ThreadPoolExecutor详解(整理详细)

线程池ThreadPoolExecutor详解(整理详细)

yuechuzhixing的博客 3万+

IPD流程中CBB管理的5个致命误区,第3个坑了80%的团队

本文深入剖析了IPD流程中CBB管理的五个致命误区,尤其指出缺乏有效的度量与激励机制是影响80%团队的核心陷阱。文章强调CBB的核心在于前瞻性设计,而非简单归档,并需平衡通用性与产品竞争力,同时建立持续运营机制,确保CBB与市场需求对齐,从而真正实现缩短开发周期、降低成本的目标。

weixin_29234423的博客 569

Java基础学习之深入理解ThreadPoolExectuor

文章目录0.写在最前面1. 什么是线程池?2.线程池解决了什么问题?3. Executor4.ThreadPoolExecutor5.线程的状态6.线程池是如何维护自生状态的?7.任务调度机制7.1 任务调度7.2 任务缓冲7.3 任务申请7.4 任务拒绝8.Worker线程管理8.1 Worker线程8.2 worker线程的增加8.3 worker线程回收8.4 Worker线程执行任务9.JDK提供的四个线程池10.感谢大佬 0.写在最前面 最近学习ThreadPoolExecutor这个类,然后也

圆师傅的博客 1472

六轴机械臂正逆解计算

机械臂运动学就是。包括(Forward Kinematics)和(InverseKinematics)两部分。正运动学就是逆运动学则是关节变量->机械臂末端执行器的姿势=正向运动学机械臂未端执行器的位姿->关节变量=逆向运动学。

gaoxiaochan的博客 1万+

10倍开发者的 Dify 魔法书:从零构建全栈 AI 应用

“不懂底层算法,也能开发爆款 AI 应用吗?” 答案是:绝对可以。 Dify 正在重新定义 AI 应用的开发范式——通过可视化的低代码平台,将原本需要数周的开发周期压缩到几小时。无论你是前端、后端、产品经理,还是渴望破局的独立开发者,这都是你不可错过的红利。 我们将手把手教你利用 Dify 快速接入百模大战,零代码搭建企业级知识库,并一键发布你的专属 AI 助手、智能客服和自动化工作流。 告别重复造轮子,掌握 Dify,一个人就是一支 AI 团队。现在上车,开启你的 10 倍速开发之旅!

davidwang456的专栏 682

ThreadPoolExcutor线程池使用总结

1、背景: 在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedTh...

技术成就人生 2万+

OBYC自动科目确定整理

WGI是用来重估发货的,通过比较发货时的价格和最新计算的价格,以此将所有差异过账到分配给此事务码的总账科目。是工厂还是公司,一般项目中都是使用工厂,使用工厂的意思就是物料在每个工厂下有一个价格,如果使用公司,则一个公司下的所有工厂都使用一个价格。如果该物料用的是移动平均价,那么该库存依然还存在的情况下,这个价格差异会过账到存货科目上而不会过账到存货的价格差异科目上。用于确定存货评估过账的存货冲抵科目。事务码WGR是用来重估工厂收货的,根据 计算出来的价格差异,把库存的调整过账分配给这个事务码中的总账科目。

nopicture的博客 348

线程池 ThreadPoolExcutor

1.线程池的继承关系 Executor接口很简单,只有一个execute方法。 ExecutorService是Executor的子接口,增加了一些常用的对线程的控制方法,之后使用线程池主要也是使用这些方法。 AbstractExe...

小菜鸟 1481

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

线程池-ThreadPoolExcutor

线程池ThreadPoolExecutor及其原理

qq_34374058的博客 849

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java线程池ThreadPoolExcutor

1.线程池的工作原理: 1.1线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。 1.2.当调用execute()方法添加一个任务时,线程池会做如下判断: a.如果正在运行的线程数小于corePoolSize,那么马上创建线程运行这个任务。 b.如果正在运行的线程数大于或者等于corePoolSize,那么将这个任务放入队列。 c.如果这个时候队列满了,而且正在运行的线程数量小于maximumPoolSize,那么还是要创建线程运行这个

一个摩羯座的程序猿 334

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ThreadPoolExcutor 线程池

昨天在查看项目时,偶尔看到代码里通过静态代码块实现的单例模式的线程池,如下: public static final ThreadPoolExecutor threadPool; static { int nCpu = Runtime.getRuntime().availableProcessors(); int maxPoolSize = (2 * nCpu) + 1; ...

grant167的专栏 569

ThreadPoolExcutor线程池

Executors方法创建自带线程池 Java 里面线程池的顶级接口是 Executor,但是严格意义上讲 Executor 并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是 ExecutorService 线程池不建议使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:E...

WillliveWillWork的博客 303

线程池ThreadPoolExcutor的使用

摘自阿里巴巴开发手册: 【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 返回的线程池对象的弊端如下: FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可...

m0_38101382的博客 630

线程池ThreadPoolExcutor详解

Java线程池概述 线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的。 ThreadPoolExecutor提供了四个构造函数,最后都会归结于下面这个构造方法: /** * Creates a new {@code ThreadPoolExecutor} with the given initial * para...

微信公众号:大数据从业者 665

【多线程】ThreadPoolExcutor线程池

【多线程】ThreadPoolExcutor线程池一、Executors创建线程池1.newFixedThreadPool三级目录2.newSingleThreadExecutor3.newCachedThreadPool4.newScheduledThreadPool二、ThreadPoolExcutor显示创建线程池1.入参说明2.内部执行流程 一、Executors创建线程池 1.newFixedThreadPool 先来看看源码中是怎么构造的: public static ExecutorServ

kezade的blog 299

线程池ThreadPoolExcutor【复习必看】

因为如果使用Excutors这个类下提供好的线程,它里面有一些线程池是会有问题的,比如它们的某些队列是无界的,如果将线程加入道阻塞队列里不断地添加,会造成OOM。并且使用自定义线程池可以让这个线程池在这个程序达到最强的性能。如果有的业务是IO密集型的,核心线程数就是CPU核数*2,CPU密集型就是CPU核数+1,类似这种可以优化线程池达到最强性能。并且可以设置线程工厂的,在这可以定义每个线程造出来的时候设置线程的名字编号,为了之后出错调试信息的时候可以更加方便。

门牙咬脆骨的奋斗日志 535

线程池ThreadPoolExcutor

/* * interface Executor 执行行程接口 * +executor(Runnable object)执行任务 * interface ExecutorService 管理线程接口 * +shutdown()关闭执行器 * +shutdownNow()立即关闭执行器,返回未完成任务清单 * +isSh

tuke_tuke的博客 666
上一篇: java线程内存模型,线程、工作内存、主内存
下一篇: mycat 的那些事(推荐)
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值