Java Executors(线程池)

Java 并发编程—— Executors 分析应用,阿里架构师深入讲解Java开发 950)][外链图片转存中…(img-FIrcADYT-1711049786951)][外链图片转存中…(img-4AC4OlCe-1711049786951)]由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)[外链图片转存中…(img-mQ2lFL5Z-1711049786952)][外链图片转存中…(img-eLBkm3kU-1711049786952)] 阅读详情
Sun在Java5中,对 Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。

  有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程。目前有关这方面的资料和书籍都少之又少,大所属介绍线程方面书籍还停留在java5之前的知识层面上。

  当然新特征对做多线程程序没有必须的关系,在java5之前通用可以写出很优秀的多线程程序。只是代价不一样而已。

  线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

  在Java5之前,要实现一个线程池是相当有难度的,现在Java5为我们做好了一切,我们只需要按照提供的API来使用,即可享受线程池带来的极大便利。

  Java5的线程池分好多种:具体的可以分为两类,固定尺寸的线程池、可变尺寸连接池。

  在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解的是java.util.concurrent.Executors类的API,这个类提供大量创建连接池的静态方法,是必须掌握的。

一、固定大小的线程池,newFixedThreadPool:

  1. package app.executors;  
  2.   
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.ExecutorService;  
  5.   
  6. /** 
  7.  * Java线程:线程池 
  8.  *  
  9.  * @author 冯小卫 
  10.  */  
  11. public class Test {  
  12.     public static void main(String[] args) {  
  13.         // 创建一个可重用固定线程数的线程池  
  14.         ExecutorService pool = Executors.newFixedThreadPool(5);  
  15.         // 创建线程  
  16.         Thread t1 = new MyThread();  
  17.         Thread t2 = new MyThread();  
  18.         Thread t3 = new MyThread();  
  19.         Thread t4 = new MyThread();  
  20.         Thread t5 = new MyThread();  
  21.         // 将线程放入池中进行执行  
  22.         pool.execute(t1);  
  23.         pool.execute(t2);  
  24.         pool.execute(t3);  
  25.         pool.execute(t4);  
  26.         pool.execute(t5);  
  27.         // 关闭线程池  
  28.         pool.shutdown();  
  29.     }  
  30. }  
  31.   
  32. class MyThread extends Thread {  
  33.     @Override  
  34.     public void run() {  
  35.         System.out.println(Thread.currentThread().getName() + "正在执行。。。");  
  36.     }  
  37. }  


输出结果:

  1. pool-1-thread-1正在执行。。。  
  2. pool-1-thread-3正在执行。。。  
  3. pool-1-thread-4正在执行。。。  
  4. pool-1-thread-2正在执行。。。  
  5. pool-1-thread-5正在执行。。。  


改变ExecutorService pool = Executors.newFixedThreadPool(5)中的参数:ExecutorService pool = Executors.newFixedThreadPool(2),输出结果是:

  1. pool-1-thread-1正在执行。。。  
  2. pool-1-thread-1正在执行。。。  
  3. pool-1-thread-2正在执行。。。  
  4. pool-1-thread-1正在执行。。。  
  5. pool-1-thread-2正在执行。。。  


从以上结果可以看出,newFixedThreadPool的参数指定了可以运行的线程的最大数目,超过这个数目的线程加进去以后,不会运行。其次,加入线程池的线程属于托管状态,线程的运行不受加入顺序的影响。

 

二、单任务线程池,newSingleThreadExecutor:

仅仅是把上述代码中的ExecutorService pool = Executors.newFixedThreadPool(2)改为ExecutorService pool = Executors.newSingleThreadExecutor();

输出结果:

  1. pool-1-thread-1正在执行。。。  
  2. pool-1-thread-1正在执行。。。  
  3. pool-1-thread-1正在执行。。。  
  4. pool-1-thread-1正在执行。。。  
  5. pool-1-thread-1正在执行。。。  

可以看出,每次调用execute方法,其实最后都是调用了thread-1的run方法。

 

三、可变尺寸的线程池,newCachedThreadPool:

与上面的类似,只是改动下pool的创建方式:ExecutorService pool = Executors.newCachedThreadPool();


输出:

  1. pool-1-thread-1正在执行。。。  
  2. pool-1-thread-2正在执行。。。  
  3. pool-1-thread-4正在执行。。。  
  4. pool-1-thread-3正在执行。。。  
  5. pool-1-thread-5正在执行。。。  


这种方式的特点是:可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。

四、延迟连接池,newScheduledThreadPool:

  1. package app.executors;  
  2.   
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.ScheduledExecutorService;  
  5. import java.util.concurrent.TimeUnit;  
  6.   
  7. /** 
  8.  * Java线程:线程池 
  9.  *  
  10.  * @author 冯小卫 
  11.  */  
  12. public class Test {  
  13.     public static void main(String[] args) {  
  14.         // 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。  
  15.         ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);  
  16.         // 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口  
  17.         Thread t1 = new MyThread();  
  18.         Thread t2 = new MyThread();  
  19.         Thread t3 = new MyThread();  
  20.         // 将线程放入池中进行执行  
  21.         pool.execute(t1);  
  22.         // 使用延迟执行风格的方法  
  23.         pool.schedule(t2, 1000, TimeUnit.MILLISECONDS);  
  24.         pool.schedule(t3, 10, TimeUnit.MILLISECONDS);  
  25.   
  26.         // 关闭线程池  
  27.         pool.shutdown();  
  28.     }  
  29. }  
  30.   
  31. class MyThread extends Thread {  
  32.     @Override  
  33.     public void run() {  
  34.         System.out.println(Thread.currentThread().getName() + "正在执行。。。");  
  35.     }  
  36. }  


读者可以尝试改变Executors.newScheduledThreadPool(2)的参数来得到更多的体验,当然,让

  1. @Override  
  2. public void run() {  
  3.     System.out.println(Thread.currentThread().getName() + "正在执行。。。");  
  4. }  

 

变成一个无限循环,你可以得到更多的关于pool.shutdown()的用法。

 

五:单任务延迟连接池(和上面类似,就不写了)。当然我们也可以自定义线程池,这里就不写了,累啊……

【JAVA】40. Executors工具类与线程池最佳实践 Executors是 Java 中一个用于创建线程池的工具类,它提供了一系列静态方法来创建不同类型的线程池,简化了线程池的创建过程。这些方法返回的线程池实现类都是基于或。 阅读详情

相关推荐

Executors与ThreadPoolExecutor(阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建)

最近阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险 Executors利用工厂模式向我们提供了4种线程池实现方式,但是并不推荐使用,原因是使用Executors创建线程池不会传入这个参数而使用默认值所以我们常常忽略这一参数,而且默认使用的参

qq_33300570的博客 2万+

细讲Java线程池Executor

CPU密集型 :线程池的大小推荐为CPU数量 + 1,CPU数量可以根据Runtime.availableProcessors方法获取CPU数量 * CPU利用率 * (1 + 线程等待时间/线程CPU时间)将任务分为CPU密集型和IO密集型,然后分别使用不同的线程池去处理,从而使每个线程池可以根据各自的工作负载来调整推荐使用有界队列,有界队列有助于避免资源耗尽的情况发生。...

Java_ttcd的博客 1010

Java中ExecutorService线程池的使用(Runnable和Callable多线程实现)

线程的创建和释放,需要占用不小的内存和资源。如果每次需要使用线程时,都new 一个Thread的话,难免会造成资源的浪费,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。不利于扩展,比如如定时执行、定期执行、线程中断,所以很有必要了解下ExecutorService的使用。ExecutorService是Java提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过ExecutorService获得线程。...

BADAO_LIUMANG_QIZHI的博客 8210

Java线程池Executor详解

线程池的大小推荐为CPU数量 + 1,CPU数量可以根据Runtime.availableProcessors方法获取CPU数量 * CPU利用率 * (1 + 线程等待时间/线程CPU时间)将任务分为CPU密集型和IO密集型,然后分别使用不同的线程池去处理,从而使每个线程池可以根据各自的工作负载来调整推荐使用有界队列,有界队列有助于避免资源耗尽的情况发生。

jcc4261的博客 1552

05-Java通过Executors提供四种线程池

Java通过Executors提供四种线程池,分别为: 1. newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 3. newScheduledThreadPool 创建一个定长线程池,支持定时及周

九师兄 1006

Android无线调试:adb tcpip连接实战指南

本文详细介绍了Android无线调试的完整流程,重点讲解如何使用adb tcpip命令通过Wi-Fi连接设备,摆脱数据线束缚。涵盖环境配置、连接实战、稳定性优化及常见问题排查,帮助开发者高效实现无线adb调试,提升工作效率。

pink的博客 722

Java笔试面试-Executors

Executors 可以创建以下六种线程池: FixedThreadPool(n):创建一个数量固定的线程池,超出的任务会在队列中等待空闲的线程,可用于控制程序的最大并发数。 CachedThreadPool():短时间内处理大量工作的线程池,会根据任务数量产生对应的线程,并试图缓存线程以便重复使用,如果限制 60 秒没被使用,则会被移除缓存。 SingleThreadExecutor():创建...

HenryLei的博客 2万+

影刀RPA进阶:Excel多条件筛选与数据提取实战

本文详细介绍了如何利用影刀RPA实现Excel多条件筛选与数据提取的自动化。通过拆解文本、数值、日期及颜色筛选等核心指令,并结合实战案例,指导用户构建稳健的销售数据提取机器人,从而高效处理复杂数据报表,提升工作效率。

onion的博客 530

java中executors_Java通过Executors提供四种线程池

http://cuisuqiang.iteye.com/blog/2019372Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledTh...

weixin_42548893的博客 789

智能解决装箱问题:使用优化算法实现高效包装

装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。

MindOpt_003的博客 5546

黑苹果从入门到精通:最详细的VMware安装macOS教程

前言 不知为何,以前我发的两篇关于黑苹果的文章或没过审或被删除,最近SMZDM上有不少优质的黑苹果文章发出来,貌似禁令已开,前段时间在一篇写的很不错的黑果文章下吹牛说今年要写一个系列,故有了这篇文章作为系列的开头。 系列的名字起的有点俗,叫做xxx从入门到精通,但是我很喜欢,相信过半的黑果群众都是程序员,作为教程来说这个名字俗但是好用,我也希望这个系列能像其它入门到精通系列一样,让大家学到东西...

La victoria的博客 14万+

Java线程池之Executors详解

ThreadPoolExecutor 和 Executors 都是用来创建线程池的,其中 ThreadPoolExecutor 创建线程池的方式相对传统,而 Executors 提供了更多的线程池类型(6 种),但很不幸的消息是在实际开发中并不推荐使用 Executors 的方式来创建线程池。Executors 可以创建以下六种线程池。CachedThreadPool():短时间内处理大量工作的线程池,会根据任务数量产生对应的线程,并试图缓存线程以便重复使用,如果限制 60 秒没被使用,则会被移除缓存。

subsistent的博客 1059

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

ACGkaka的博客 6984

Java通过Executors提供四种线程池

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 newS...

nothingchoice的博客 218

044、镜头脏污与异物检测:产线 AOI 检测方案与 ISP 脏污补偿

文章摘要(148字) 本文针对镜头生产中的脏污检测问题,提出产线AOI检测与ISP补偿结合的解决方案。产线端采用明场、暗场、偏振三通道联合检测技术,将油污漏检率从8.3%降至0.2%。ISP端通过RAW域局部梯度分析和频域补偿算法,动态修复产线漏检的微小脏污。作者结合实战案例,详细分析了传统灰度阈值法的局限性,并给出多模态检测的代码实现要点,强调必须建立"产线拦截+终端补偿"的双重防护机制。

sundong_81的博客 228

在hyper-v管理器中修改WSL虚拟交换机后,打开wsl闪退

此次是因为修改了WSL虚拟交换机造成的wsl打不开或闪退,还有一种可能是关闭了hyper-v造成了wsl。

DN金猿的博客 1172

《Java线程池》Executor 以及Executors

《Java线程池》Executor 以及Executors线程池的相关类的体系结构如下:先看Executor接口,是最根上的接口 public interface Executor { /* * Executes the given command at some time in the future. The command * may

wojiushimogui的博客 1450

26. 如何给 SAP BTP Cloud Foundry 环境分配运行时内存

摘要:本文解答了SAP BTP Cloud Foundry环境中Space可用内存为0MB的问题。指出Space内存配额取决于Org配额分配,其计算方式为Org总配额减去所有运行中应用实例的内存预留总和。详细解释了SAP BTP的资源分配层级(Global account→Subaccount→Environment→Org→Space),并说明如何通过Global account的Entity Assignments查看Memory Plan配额分配(以GB为单位)。最后建议遇到问题的用户检查Subacc

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1262

Java 线程池的使用【四】【Executors】

一、使用Executors创建四种线程池: Executors类提供工厂方法用来创建不同类型的线程池,实际上Executors创建的四种线程底层的实现都是通过ThreadPoolExecutor实现的。 ExecutorService executorService = Executors.具体类型的线程池; 通过调用返回值ExecutorService类的submit方法,将具体执行的线程任务传入到线程池中并执行。 线程任务的创建:跳转链接(下面例子都以Runnable接口为例)。 1)newCache

单枪匹码 1845

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java Executors类的9种创建线程池的方法及应用场景分析

在Java中,Executors 类提供了多种静态工厂方法来创建不同类型的线程池。: 创建一个可缓存的线程池,如果线程池中的线程超过60秒没有被使用,它们将被终止并从缓存中移除。: 创建一个固定大小的线程池,其中 nThreads 指定了线程池中线程的数量。: 创建一个单线程的执行器,它创建单个工作线程来执行任务。: 创建一个固定大小的线程池,它可以根据需要创建新线程,但会按照固定延迟执行具有给定初始延迟的任务。: 创建一个工作窃取线程池,它使用多个队列,每个线程都从自己的队列中窃取任务。

dsgdauigfs的博客 1575

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java线程池 Executors 和 ExecutorService 详解

只负责创建,用完就"丢"

y2222_的博客 982

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java进阶之线程池Executors :用法实例(一百四十五)

本篇目的:Java线程池之Executors:用法实例基本概念Executors是Java并发包提供的线程池工厂类,用于快捷创建各类线程池,屏蔽底层ThreadPoolExecutor复杂参数。功能提供newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool等静态方法,支持不同并发策略。使用限制。

Android系统攻城狮 1127

Java —— Executors、ExecutorService、ThreadPoolExecutor线程池

Executors类 工具类、线程池的工厂类,用于创建并返回不同类型的线程池。 Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池 Executors.newFixedThreadPool(n); 创建一个可重用固定线程数的线程池 Executors.newSingleThreadExecutor() :创建一个只有一个线程的线程池 Ex...

Hern(宋兆恒) 689

【Java面试进阶】谈谈为什么禁止使用Executors创建线程池?

谈谈为什么禁止使用Executors创建线程池?什么是Executors?Executors存在什么问题?Executors为什么存在缺陷?如何正确创建线程池? 首先,可以通过Executors静态工厂构建线程池,但是一般不建议这样使用。 什么是Executors? Executors是一个Java中的工具类。提供工厂方法来创建不同类型的线程池。如下所示: 从源码中可知,Executors的创建线程池的方法,创建出来的线程池都实现了ExecutorService接口。常用方法有以下几个: newFixe

小哲的博客 5899

java自带线程池Executors

Executors类里边常用的四种线程池 public class Executors { //1.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在无界队列中等待 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExec...

zhangkai0575的博客 197
上一篇: PendingIntent和AlarmManager--------启动定时任务及详解
下一篇: JAVA设计模式之单例模式
有志青年L
博客等级 码龄10年 30粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值