Java并发多线程编程——Executors类

article/2025/9/9 2:26:39

目录

    • 一、Executors的理解
    • 二、Executors类图结构
    • 二、Executors常用的方法
    • 三、线程池的创建分为两种方式(主要介绍通过Executors类创建的方式)
        • 1、newFixedThreadPool方法示例
        • 2、newSingleThreadExecutor方法示例
        • 3、newCachedThreadPool方法
        • 4、newScheduledThreadPool方法示例
    • 四、Executors创建线程池原理

一、Executors的理解

  • Executors类属于java.util.concurrent包;
  • 线程池的创建分为两种方式:ThreadPoolExecutor 和 Executors;
  • Executors(静态Executor工厂)用于创建线程池;
  • 工厂和工具方法Executor , ExecutorService , ScheduledExecutorService , ThreadFactory和Callable在此包中定义的类;
  • jdk1.8API中的解释如下:
    在这里插入图片描述

二、Executors类图结构

在这里插入图片描述

二、Executors常用的方法

在这里插入图片描述

  • public static ExecutorService newFixedThreadPool(int nThreads) 一种线程数量固定的线程池,当线程处于空闲状态时,他们并不会被回收,除非线程池被关闭。当所有的线程都处于活动状态时,新的任务都会处于等待状态,直到有线程空闲出来。
  • public static ExecutorService newSingleThreadExecutor() 创建单个线程。它适用于需要保证顺序地执行各个任务;并且在任意时间点,不会有多个线程是活动的应用场景;如果单个线程挂掉后,会重启一个线程继续执行任务。
  • public static ExecutorService newCachedThreadPool() 创建一个根据需要创建新线程的线程池,但在可用时将重新使用以前构造的线程, 如果没有可用的线程,将创建一个新的线程并将其添加到该池中。 未使用六十秒的线程将被终止并从缓存中删除;即用的时候创建线程,不用的时候销毁线程。
    - public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 创建一个线程池,可以调度命令在给定的延迟之后运行,或定期执行;支持执行定时性或周期性任务。
  • public static ExecutorService newWorkStealingPool(int parallelism) jdk1.8才出现的,创建一个维护足够的线程以支持给定的并行级别的线程池,并且可以使用多个队列来减少争用。 ( jdk1.8版本新增的方法 )

三、线程池的创建分为两种方式(主要介绍通过Executors类创建的方式)

1、newFixedThreadPool方法示例

  • 代码

    package com.xz.thread.executors;import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;/*** @description: * @author: xz* @create: 2021-06-16 21:33*/
    public class Demo {public static void main(String[] args) {//创建数量固定的线程池,线程池数量为3ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);for(int i=0;i<5;i++){fixedThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());try {Thread.sleep(500);System.out.println("睡眠一秒");} catch (InterruptedException e) {e.printStackTrace();}}});}}
    }
  • 输出结果如下图

    在这里插入图片描述

  • 结论:示例中创建了数量固定为3的线程,由输出结果截图可知,遍历次数为5次,当执行一轮(3次)后,停顿一秒钟,直到有线程空闲出来,才继续第4次执行。

2、newSingleThreadExecutor方法示例

  • 代码

    package com.xz.thread.executor;import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;/*** @description:* @author: xz* @create: 2021-06-15 22:33*/
    public class Demo {public static void main(String[] args) {//创建单个线程ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();for(int i=0;i<5;i++){singleThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());try {Thread.sleep(1000);System.out.println("睡眠一秒");} catch (InterruptedException e) {e.printStackTrace();}}});}}
    }
  • 输出结果如下图

    在这里插入图片描述

  • 结论:示例中创建了创建单个线程,每执行一次任务后,睡眠一秒,保证顺序地执行各个任务。

3、newCachedThreadPool方法

  • 代码
package com.xz.thread.executor;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** @description:* @author: xz* @create: 2021-06-15 22:33*/
public class Demo {public static void main(String[] args) {//创建带有缓存功能的线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool();for(int i=0;i<5;i++){cachedThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());try {Thread.sleep(1000);System.out.println("睡眠一秒");} catch (InterruptedException e) {e.printStackTrace();}}});}}
}
  • 输出结果如下图

    在这里插入图片描述

  • 结论:示例中根据需要创建带有缓存线程的线程池,并在可用时将重新使用以前构造的线程。

4、newScheduledThreadPool方法示例

  • 代码

    package com.xz.thread.executor;import java.time.LocalDateTime;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;/*** @description:* @author: xz* @create: 2021-06-15 22:33*/
    public class Demo {public static void main(String[] args) {//创建执行周期性任务的线程池ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);/*** schedule(Runnable command,long delay, TimeUnit unit)方法参数解析* command 表示执行任务命令* delay 表示从现在开始延迟执行的时间* unit  延时参数的时间单位*/scheduledThreadPool.schedule(new Runnable() {@Overridepublic void run() {System.out.println("scheduledThreadPool:"+LocalDateTime.now());}},1L, TimeUnit.MINUTES);System.out.println("当前时间:"+LocalDateTime.now());}
    }
  • 输出结果如下图
    在这里插入图片描述

  • 结论:示例中创建执行周期性或定时性任务的线程池,由输出结果可知,设置的1分钟后执行任务已经生效。

四、Executors创建线程池原理

1、无论是创建何种类型线程池(newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool等等),均会调用ThreadPoolExecutor构造函数。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、 ThreadPoolExecutor构造函数中的参数解析

  • corePoolSize 核心线程最大数量,通俗点来讲就是,线程池中常驻线程的最大数量
  • maximumPoolSize 线程池中运行最大线程数(包括核心线程和非核心线程)
  • keepAliveTime 线程池中空闲线程(仅适用于非核心线程)所能存活的最长时间
  • unit 存活时间单位,与keepAliveTime搭配使用
  • workQueue 存放任务的阻塞队列
  • handler 线程池饱和策略

http://chatgpt.dhexx.cn/article/dlwAYH0S.shtml

相关文章

Executors一篇就够

Executors框架包含的内容十分的多&#xff1a;看图&#xff1a; 一、各个接口的作用 按照图示关系进行介绍&#xff1a; Executor 该接口作为顶层接口只有一个execute()方法 execute(Runnable r) 该接口接受一个Runnable实例&#xff0c;即要执行的任务ExecutorService 该…

Executors工具类的相关方法

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生。本篇将记录创建线程池的Executors工具类里面的方法&#xff0c;方便加深知识印象和复习使用。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适合复习中&#xff0c;面试中的大佬&a…

java并发编程:Executor、Executors、ExecutorService

Executors 在Java 5之后&#xff0c;并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的&#xff0c;其内部使用了线程池机制&#xff0c;它在java.util.cocurrent 包下&#xff0c;通过该框架来控制线程的启动、执行和关闭&#xff0c;可以简化…

nlinfit非线性回归拟合

% % 使用指定函数对下述两变量进行曲线拟合 % % yak1*exp(m*t)k2*exp(-m*t); % % 离散点: t[0,4,8,40], % % y[20.09,64.52,85.83,126.75]; % % t-自变量 y-因变量 a,m,k1,k2为常数 % % 用非线性回归nlinfit&#xff0c;如果数据点多些&#xff0c;效果会更好。 脚本&…

matlab的nlinfit函数,用matlab如何进行非线性拟合 nlinfit函数?

用非线性回归nlinfit&#xff0c;如果数据点多些&#xff0c;效果会更好。 function nonlinefit clc;clear; t[0 4 8 40]; y[20.09 64.52 85.83 126.75]; betanlinfit(t,y,myfunc,[1 1 1 1]) abeta(1) k1beta(2) k2beta(3) mbeta(4) tt0:1:40 yyak1*exp(m*tt)k2*exp(-m*tt) plo…

【MATLAB统计分析与应用100例】案例013:matlab读取Excel数据,调用nlinfit函数作一元非线性回归

1. 一元线性回归分析效果预览 2. matlab完整实现代码 %读取数据,绘制散点图** HeadData = xlsread(examp08_02.xls); %从Excel文

matlab中用polyfit、regress、nlinfit等进行详细的回归分析

目录 1.说明2.回归的介绍2-1.前面两篇所发现的一些问题2-1-1.回归和拟合是什么关系?2-1-2.回归到底是做预测还是用来去脏数据?3.三个函数的核心:最小二乘法3-1.介绍3-2.matlab代码4.函数polyfit(线性)5.函数regress(线性)5-1.输出b,bint,r,rint,stats5-2.应用5.2-1.一元…

曲线拟和函数lsqcurvefit nlinfit

转载自&#xff1a;http://panda0411.com/2011/08/29/curve-fit-and-function-lsqcurvefitnlinfit/ 琢磨了好久matlab自带的曲线拟和工具箱, 发现这货只能解决从离散数据得到各种类型的拟和效果, 但是反之貌似没法实现, google一下有这两个函数可以用:lsqcurvefit和nlinfit ls…

Matlab学习手记——非线性数据拟合:nlinfit和lsqcurvefit

目的&#xff1a;通过一个实例了解Matlab的数据拟合函数nlinfit和lsqcurvefit的使用。 结果图 具体数值 p 0.3000 50.0000 0.4000 200.0000 0.3000 800.0000 p1 0.3267 48.3589 0.4030 226.6525 0.2838 809.6680 p2 0.3267 48.3646 0.4031 226.735…

MATLAB多元非线性回归nlinfit拟合圆拟合球拟合函数

先上实验效果&#xff0c;你觉得有帮助可以继续阅读。代码解析在B站有上传视频&#xff08;用户昵称同名&#xff09;&#xff0c;代码也有详细备注。 拟合圆和球面&#xff1a; 拟合多元非线性函数&#xff1a;y p1*x1p2*x1^2p3*x2p4*x2^2exp(-p5*x3)的拟合结果&#xff1a;…

MATLAB 非线性隐函数拟合采坑记录(使用 fsolve solve nlinfit lsqcurvefit函数)

MATLAB 非线性隐函数拟合采坑记录&#xff08;使用 fsolve solve nlinfit lsqcurvefit函数&#xff09; 问题描述解决思路错误示范1代码思路原因解释模型更正更正模型1更正模型2 错误示范2代码思路原因解释模型更正更正模型1更正模型2 总结 问题描述 MATLAB的 nlinfit 和 lsqc…

Matlab多元非线性函数拟合

看了多篇文章&#xff0c;觉得没有一篇比较全&#xff0c;且可以参照的多元非线性函数拟合&#xff0c;看了多篇文章后总结以下内容&#xff0c;主要以示例给出&#xff0c;希望能帮助到大家快速上手。 1.需要用到的函数语法 beta nlinfit(X, Y, modelfun, beta0) X为你的自…

MATLAB中用nlinfit做多元非线性拟合(回归)

MATLAB中有一个多元非线性拟合的功能是nlinfit 基本语法是&#xff1a; beta nlinfit(X,Y,modelfun,beta0) 式子左边的beta可以是一个向量&#xff0c;向量的元素就是要回归的模型中的参数。 式子右边&#xff0c;modelfun是要回归的函数形式。X是函数的自变量数据&#xff1b…

使用nlinfit函数进行拟合时出现Error using nlinfit>checkFunVals (line 611)

在使用nlinfit函数进行拟合时出错&#xff0c;内容如下&#xff1a; The function you provided as the MODELFUN input has returned Inf or NaN values.从第一行可以看出&#xff0c;由于赋予的初始值导致了函数生成了NaN&#xff08;无解&#xff09;&#xff0c;所以整个回…

【数学建模】多元非线性回归nlinfit(Matlab代码实现)

目录 1 基本语法 2 算例及Matlab代码实现 2.1 算例 2.2 数据 2.3 Matlab代码实现 1 基本语法 2 算例及Matlab代码实现 2.1 算例 熔喷非织造材料是口罩生产的重要原材料&#xff0c;具有很好的过滤性能&#xff0c;其生产工艺简单、成本低、质量轻等特点&#xff0c;受到国…

Matlab 使用nlinfit 函数进行多元非线性回归,并且绘制曲线拟合的误差区间

Matlab 使用nlinfit 函数进行多元非线性回归&#xff0c;并且绘制曲线拟合的误差区间 一、前言二、nlinfit函数使用1、函数语法2、拟合示例&#xff1a; 三、误差阴影绘制四、整体源码五、思考参考博客 一、前言 这个也是最近我接到的一个小项目里的内容&#xff1a; 有一组数…

利用nlinfit函数实现数据非线性拟合

所谓“拟合”&#xff0c;指的是在已有一组实验数据的前提下&#xff0c;研究这组数据有怎样的函数关系——最终结果是从这一组看似漫无规律的数据点中“找出”能用数学表达式表示的规律。 用数学语言描述的拟合定义如下&#xff1a; 一个典型的数据拟合过程包括以下几个步骤&…

Matlab非线性拟合函数——nlinfit

我们平时最常用的非线性拟合函数还是多项式拟合,有一天学弟突然问了我nlinfit 这个函数,然后直接查询matlab官方文档,原来非线性函数还可以用这个函数,下面来看看matlab官方文档的说明: 英文?没关系,下面看一下中文用法: beta = nlinfit(X, Y, modelfun, beta0) beta:…

[MATLAB]非线性回归--自配函数(nlinfit)

当谈到非线性回归模型的时候&#xff0c;同学们应该紧密的将线性回归紧密结合在一起&#xff0c;因为非线性回归很容易过拟合。那我们从一个案例谈一下非线性 拿到题目看到一个变量x一个y&#xff0c;非线性问题步骤应该是这样子的&#xff1a; 画出散点图根据散点图确定须配…

dozer使用: list对象mapping 配置

记录dozer的使用&#xff0c;复杂类型配置。 文档&#xff1a;https://dozermapper.github.io/user-guide.pdf 参考地址&#xff1a;https://github.com/klvnnsrikanth/DozerMappingExample.git Demo 的目录结构&#xff1a; 不是集合的普通映射方式 Source 类: Destinatio…