news 2026/7/21 1:55:58

Java多线程案例--初识线程池

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java多线程案例--初识线程池

池/线程池是什么

  • 虽然创建销毁线程比创建销毁进程更轻量,但是频繁创建销毁线程必然会导致效率的下降。
    于是有了池这样的概念,池的概念可以类比于备用物品/资源,就像备胎一样,需要他的时候就可以使用,不需要的时候就是闲置状态
  • 线程池就是为了解决频繁创建销毁带来的低效率。如果某个线程不再使用了,并不是真正把线程释放,而是放到一个里留着备用,这样一来下次如果需要用到线程就直接从池子中取,不必通过系统来创建了。

标准库中的线程池

  • 在标准库中我们通过ExecutorService来创建一个线程池实例,从ExecutorService进而延伸出两种创建线程池的方式。
  • 第一种,通过Executors工厂类来创建出几种不同风格的线程池

什么是工厂类?这里我觉得有一个词“预制”很好来形容工厂类,在编程中,预制本质是提前封装资源、逻辑或组件,减少重复开发,提高效率。就像一个一套提前准备好的模版一样,你需要的时候直接去套模版就可以提高效率

  • Executors又可以延伸出创建线程池的几种方式分别是:
    newFixedThreadPool:创建固定线程数的线程池
    newCachedThreadPool:创建线程数目动态增长的线程池
    newSingleThreadExecutor:创建只包含单个线程的线程池
    newScheduledThreadPool:设定 延迟时间后执行命令,或者定期执行命令
  • 在创建好的实例中我们用submit方法来向线程池里添加要执行的内容/任务
ExecutorServiceservice=Executors.newFixedThreadPool(4);service.submit(newRunnable(){@Overridepublicvoidrun(){}});
ExecutorServiceservice2=Executors.newCachedThreadPool();service2.submit(newRunnable(){@Overridepublicvoidrun(){System.out.println("pool");}});
ExecutorServiceservice3=Executors.newSingleThreadExecutor();service3.submit(newRunnable(){@Overridepublicvoidrun(){System.out.println("pool");}});
ExecutorServiceservice4=Executors.newScheduledThreadPool(4);service4.submit(newRunnable(){@Overridepublicvoidrun(){System.out.println("pool");}});
  • 第二种创建ExecutorService实例的方式就是ThreadPoolExecutor
  • ThreadPoolExecutor 提供了更多的可选参数,可以进一步细化线程池行为的进行定制
  • ThreadPoolExecutor的构造方法提供了很多参数,这里我们重点来解析一下相关的参数,我们拿参数最多的最后一个来说
  • 这里我们把创建一个线程池想象成开个公司. 每个员工相当于一个线程
  • corePoolSize:正式员工的数量(正式员工,一旦录用,永不辞退)
  • maximumPoolSize:正式员工 + 临时工的数目(临时工:一段时间不干活,就被辞退)
  • keepAliveTime:临时工允许的空闲时间
  • unit:keepAliveTime的单位
  • workQueue:传递任务的阻塞队列,Runnable的容器
  • threadFactory: 创建线程的工厂,参与具体的创建线程工作
  • RejectedExecutionHandler:⚠️四个重要的拒绝策略,如果任务量超出公司的负荷了接下来怎么处理
    AbortPolicy():超过负荷,直接抛出异常,现有的任务和新的任务都不处理了
    CallerRunsPolicy():新添加进来的任务,由添加任务的人/线程来处理,不影响现有的任务
    DiscardOldestPolicy():丢弃所有任务中最老的任务,将新的任务安排到最老的任务位置来处理
    DiscardPolicy():丢弃新来的任务,维持现状,不抛出异常,不影响现有的任务

模拟实现

  • 这里模拟实现就以newFixedThreadPool这样固定大小的线程池来举例
  • 前面使用ExecutorService的实例的时候,执行完任务之后没有立马终止线程,所以这里应该使用阻塞队列来放任务
publicclassMyThreadPool{privatefinalBlockingQueue<Runnable>queue=newArrayBlockingQueue<>(100);publicMyThreadPool(intn){for(inti=0;i<n;i++){Threadt=newThread(()->{while(true){try{Runnablerunnable=queue.take();runnable.run();}catch(InterruptedExceptione){thrownewRuntimeException(e);}}});t.start();}}publicvoidsubmit(Runnablerunnable)throwsInterruptedException{queue.put(runnable);}}
  • 这里我们写一个简单的循环来模拟线程池处理任务的效果
classMain{publicstaticvoidmain(String[]args)throwsInterruptedException{MyThreadPoolmyThreadPool=newMyThreadPool(3);for(inti=0;i<1000;i++){intn=i;myThreadPool.submit(newRunnable(){@Overridepublicvoidrun(){System.out.println("执行任务"+n+" 当前线程为:"+Thread.currentThread().getName());}});}}}

  • 效果和前面标准库里的newFixedThreadPool一样
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/20 20:40:18

为什么BaklavaJS能成为Web节点编辑器的颠覆者?

为什么BaklavaJS能成为Web节点编辑器的颠覆者&#xff1f; 【免费下载链接】baklavajs Graph / node editor in the browser using VueJS 项目地址: https://gitcode.com/gh_mirrors/ba/baklavajs 还在为构建复杂的可视化编辑界面而烦恼吗&#xff1f;BaklavaJS作为基于…

作者头像 李华
网站建设 2026/7/21 0:44:04

O-MVLL代码混淆实战宝典:为移动应用构建坚不可摧的安全防线

您是否曾经担心过自己的移动应用被逆向工程分析&#xff1f;核心算法被恶意研究&#xff1f;敏感数据被轻易提取&#xff1f;在移动应用安全防护的战场上&#xff0c;O-MVLL作为基于LLVM的专业级代码混淆工具&#xff0c;正成为开发者的终极防护武器。 【免费下载链接】o-mvll …

作者头像 李华
网站建设 2026/7/20 16:12:21

2025语音AI新范式:Mistral Voxtral如何用240亿参数重构人机交互

2025语音AI新范式&#xff1a;Mistral Voxtral如何用240亿参数重构人机交互 【免费下载链接】Voxtral-Small-24B-2507 项目地址: https://ai.gitcode.com/hf_mirrors/mistralai/Voxtral-Small-24B-2507 导语 Mistral AI最新发布的Voxtral Small 24B-2507模型&#xff…

作者头像 李华
网站建设 2026/7/21 5:29:38

国际电话号码输入神器:intl-tel-input开发环境全攻略

国际电话号码输入神器&#xff1a;intl-tel-input开发环境全攻略 【免费下载链接】intl-tel-input A JavaScript plugin for entering and validating international telephone numbers 项目地址: https://gitcode.com/gh_mirrors/in/intl-tel-input 还在为全球电话号码…

作者头像 李华
网站建设 2026/7/21 5:06:28

123云盘解锁脚本终极指南:轻松实现VIP功能体验

想要在123云盘享受VIP级别的下载体验&#xff0c;却苦于会员费用高昂&#xff1f;这款基于用户脚本的123云盘解锁工具&#xff0c;将为你带来全新的云存储使用感受。通过简单的安装配置&#xff0c;即可解锁多项会员专属功能&#xff0c;让你的云盘操作更加高效便捷。 【免费下…

作者头像 李华
网站建设 2026/7/20 21:37:40

联想拯救者工具箱:10分钟掌握笔记本性能调优技巧

作为一名联想笔记本用户&#xff0c;你是否曾为官方控制软件的臃肿而烦恼&#xff1f;Lenovo Legion Toolkit这款开源工具将彻底改变你的使用体验。它专为联想军团系列笔记本设计&#xff0c;以零后台服务和极低资源占用著称&#xff0c;让你的设备真正摆脱性能瓶颈。 【免费下…

作者头像 李华