ExecutorService线程池讲解

ExecutorService线程池讲解


ExecutorService 建立多线程的步骤:
1。定义线程类     class Handler implements Runnable{
}
2。建立ExecutorService线程池     ExecutorService executorService = Executors.newCachedThreadPool();

或者

int cpuNums = Runtime.getRuntime().availableProcessors();
               //获取当前系统的CPU 数目
ExecutorService executorService =Executors.newFixedThreadPool(cpuNums * POOL_SIZE);
               //ExecutorService通常根据系统资源情况灵活定义线程池大小
3。调用线程池操作     循环操作,成为daemon,把新实例放入Executor池中
     while(true){
       executorService.execute(new Handler(socket));
          // class Handler implements Runnable{
       或者
       executorService.execute(createTask(i));
           //private static Runnable createTask(final int taskID)
     }

execute(Runnable对象)方法
其实就是对Runnable对象调用start()方法
(当然还有一些其他后台动作,比如队列,优先级,IDLE timeout,active激活等)

几种不同的ExecutorService线程池对象
1.newCachedThreadPool()      -缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse.如果没有,就建一个新的线程加入池中
-缓存型池子通常用于执行一些生存期很短的异步型任务
 因此在一些面向连接的daemon型SERVER中用得不多。
-能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。
 注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。
2. newFixedThreadPool     -newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程
-其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子
-和cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP IDLE机制之类的),所以FixedThreadPool多数针对一些很稳定很固定的正规并发线程,多用于服务器
-从方法的源代码看,cache池和fixed 池调用的是同一个底层池,只不过参数不同:
fixed池线程数固定,并且是0秒IDLE(无IDLE)
cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE  
3.ScheduledThreadPool     -调度型线程池
-这个池子里的线程可以按schedule依次delay执行,或周期执行
4.SingleThreadExecutor     -单例线程,任意时间池中只能有一个线程
-用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE(无IDLE)

上面四种线程池,都使用Executor的缺省线程工厂建立线程,也可单独定义自己的线程工厂
下面是缺省线程工厂代码:
   static class DefaultThreadFactory implements ThreadFactory {
       static final AtomicInteger poolNumber = new AtomicInteger(1);
       final ThreadGroup group;
       final AtomicInteger threadNumber = new AtomicInteger(1);
       final String namePrefix;

       DefaultThreadFactory() {
           SecurityManager s = System.getSecurityManager();
           group = (s != null)? s.getThreadGroup() :Thread.currentThread().getThreadGroup();
          
           namePrefix = “pool-” + poolNumber.getAndIncrement() + “-thread-“;
       }

       public Thread newThread(Runnable r) {
           Thread t = new Thread(group, r,namePrefix + threadNumber.getAndIncrement(),0);
           if (t.isDaemon())
               t.setDaemon(false);
           if (t.getPriority() != Thread.NORM_PRIORITY)
               t.setPriority(Thread.NORM_PRIORITY);
           return t;
       }
   }

也可自己定义ThreadFactory,加入建立池的参数中
 public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {

Executor的execute()方法
execute() 方法将Runnable实例加入pool中,并进行一些pool size计算和优先级处理
execute() 方法本身在Executor接口中定义,有多个实现类都定义了不同的execute()方法
如ThreadPoolExecutor类(cache,fiexed,single三种池子都是调用它)的execute方法如下:
   public void execute(Runnable command) {
       if (command == null)
           throw new NullPointerException();
       if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
           if (runState == RUNNING && workQueue.offer(command)) {
               if (runState != RUNNING || poolSize == 0)
                   ensureQueuedTaskHandled(command);
           }
           else if (!addIfUnderMaximumPoolSize(command))
               reject(command); // is shutdown or saturated
       }
   }
Posted in: 移动开发

转载于:https://www.cnblogs.com/Rozdy/p/5323399.html

YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线 本项目实现了一个基于YOLOv8和TensorRT的高性能火灾烟雾检测系统,具有以下核心特点: 技术架构:采用TensorRT 8.6+进行GPU加速推理,结合CUDA 12.1和OpenCV 4.8+,实现高效计算机视觉处理。系统使用XMake替代CMake构建,配置更简洁高效。 阅读详情

相关推荐

第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - 对接后端登录接口(上)

这里是Vben Admin V5版本实战体验,上一节我们前端已正常运行,但是没有实现登录。本节的重点是对接后端接口。上一节地址:第一节:Vben Admin 最新 v5.0初体验第二节:Vben Admin 登录逻辑梳理和对接后端准备后端我们采用Python的Flask项目,Flask-SQLAlchemy管理数据库模型,Flask-Migrate进行模型迁移。参考版本如下:Flask3.0.23.1.1到这里,登录接口完成,下一步要实现获取用户信息和权限的接口功能。

cuiwin的专栏 1809

socket线程池——ExecutorService应用

socket中的线程池用来处理客户端的多个连接,但超过线程池的容量范围则无能为力。 ExecutorService实现多线程socket: //服务端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReade...

移动开发记录 162

龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]

大连网龙网络科技有限公司专注于在信息科技领域中向客户提供商业解决方案,是专业的互联网服务解决方案提供商和网络营销服务专家,为用户提供一体化的网络营销整体解决方案,龙腾CMS downloadFile接口存在任意文件读取漏洞。

薛定谔嘚喵博客 691

ExecutorService线程池

ExecutorService 建立多线程的步骤: 1。定义线程类 class Handler implements Runnable{ } 2。建立ExecutorService线程池 ExecutorService executorService = Executors.newCachedThreadPool(); 或者 int cpuNums = Runt...

abc20899的专栏 272

ExecutorService为创建的线程池ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE)

ExecutorService就是要创建的线程池,案例ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE) 底层都是通过ThreadPoolExecutor实现的 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

studyvcmfc的专栏 2231

java spring 线程池_在spring boot中使用java线程池ExecutorService讲解

1. 认识java线程池1.1 在什么情况下使用线程池?1.单个任务处理的时间比较短2.需处理的任务的数量大1.2 使用线程池的好处:1.减少在创建和销毁线程上所花的时间以及系统资源的开销2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存1.3 线程池包括以下四个基本组成部分:1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;...

weixin_39556474的博客 117

EXECUTORSERVICE线程池讲解

ExecutorService 建立多线程的步骤:1。定义线程类 class Handler implements Runnable{ } 2。建立ExecutorService线程池 ExecutorService executorService = Executors.newCachedThreadPool(); 或者int cpuNums = Runtime.getRuntime().

做最好的自己,做最好的设计。 624

springboot 线程池_在spring boot中使用java线程池ExecutorService讲解

认识java线程池1.1 在什么情况下使用线程池?1.单个任务处理的时间比较短 2.需处理的任务的数量大1.2 使用线程池的好处:1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存1.3 线程池包括以下四个基本组成部分:1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务; ...

weixin_39645019的博客 448

java 线程池 spring_在spring boot中使用java线程池ExecutorService讲解

1. 认识java线程池1.1 在什么情况下使用线程池?1.单个任务处理的时间比较短2.需处理的任务的数量大1.2 使用线程池的好处:1.减少在创建和销毁线程上所花的时间以及系统资源的开销2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存1.3 线程池包括以下四个基本组成部分:1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;...

weixin_35862131的博客 571

在spring boot中使用java线程池ExecutorService讲解

认识java线程池 1.1 在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.需处理的任务的数量大 1.2 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存 1.3 线程池包括以下四个基本组成部分: 1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池...

weixin_44782075的博客 3613

企业知识库如何实现多端统一使用:浏览器、Android和iOS客户端介绍

企业知识库不能只在办公室电脑上好用,实施人员到了客户现场要查部署记录,工厂员工站在设备旁要看操作手册,出差的人也可能临时确认一份制度或项目资料。zyplayer-doc支持电脑和手机浏览器,也提供Android、iOS原生客户端,企业部署一套服务即可,账号、权限和文档都在服务端统一管理,不需要为移动端另建一套知识库。

u010047583的专栏 240

GitHub今日热榜 | 2026-08-31:多智能体课堂登顶

新进的则偏工具向:vphone-cli、ipatool 两个 iOS 工具,加上 crawl4ai、last30days、awesome-mcp-servers、checkstyle,基本是开发者生产力路线。一个 AI agent skill,跨 Reddit、X、YouTube、HN、Polymarket 等近二十个源做话题研究,综合成有出处、按人气排序的简报。专门给语言模型"去审查"的工具,用方向性消融加 Optuna 的 TPE 优化,自动把拒绝方向压下去,不用懂 transformer 内部机制。

m0_68631449的博客 479

我只开了 WLAN 调试,xAgent 用 27B 量化模型搭好了抓包环境

我只打开手机 WLAN 调试并接入同一网络,运行 Qwen3.8-27B AWQ INT4 的 xAgent 完成了 Android 设备探测、mitmproxy 与 Frida 部署、代理打通和真实流量验证。

coffee_hc的专栏 339

Android16遥控器设置按键

安卓16修改遥控器按键逻辑相关

yfvi665的博客 200

Flutter笔记--auto_route

Flutter开发中,auto_route是Flutter最主流的声明式路由代码生成框架,它的核心机制是基于代码生成,通过注解自动为开发者生成类型安全的路由代码...

ljt2724960661的博客 319

Android Jetpack Compose 与 Kotlin 协程:内存泄漏的根源、排查与完全解决方案

Compose 和协程的组合极大地提升了开发效率和代码可读性,但它们对开发者的生命周期感知能力提出了更高的要求。内存泄漏不再是单纯的内存问题,而是结构化并发设计是否严谨的体现。遵循“谁创建,谁清理”的铁律,利用 Compose 提供的副作用 API 明确划分职责边界,配合 LeakCanary 等工具的实时监控,你将能构建出既流畅又稳健的高性能应用。未来的 Android 开发,不仅需要“写得出”,更需要“关得掉”。

天空之城 256

sherpa-onnx + ZipVoice 端侧声音克隆:Flutter 中的完整 TTS 方案

ZipVoice + sherpa-onnx 是目前 Flutter 端侧 TTS 的最佳组合——模型小、集成简单、3 秒即可克隆必须用独立 Isolate——FFI 阻塞 + native 库冲突两个问题只有 Isolate 隔离能同时解决WAV 解析不能偷懒——扫描 RIFF chunk 而非硬编码偏移numSteps=4 是红线——蒸馏版模型低于 4 步音质不可接受边合成边播放是改善体验的关键——把 30 秒等待变成 3 秒首播录音对齐 24kHz、控制在 3 秒。

宇擎智脑科技的博客 365

android PhoneWindow, DecorView 详解

android PhoneWindow, DecorView 详解

maoning20080808的专栏 163

Gregoire Marc - Professional C++, 6th Edition - 2024.pdf

Gregoire Marc - Professional C++, 6th Edition - 2024.pdf

STM8 SPI从机通讯程序

STM8 SPI从机通讯程序,调试通过,直接可用。

上一篇: DB2_SQL_常用知识点&实践
下一篇: JDK内置性能监测工具使用
anyuta5577
博客等级 码龄10年 1粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值