Java多线程:Executors

article/2025/9/9 2:21:05

Executors类位于java.util.concurrent包下,提供了一些方便构建ThreadPoolExecutor和线程管理的方法。

主要方法有以下几个:

1.创建一个固定大小的线程池

  public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}
参数nThreads为线程池的大小,线程keepAliveTime为0,ThreadPoolExecutor中启动的corePoolSize线程启动后会一直运行,并不会超时退出,线程池的缓冲队列为LinkedBlockingQueue,大小为Integer.MAX_VALUE,当使用此线程池时,在同时执行的任务数量超过corePoolSize时,将会放入LinkedBlockingQueue,在LinkedBlockingQueue中的任务需要等待其他线程空闲后来执行。


2.创建一个corePoolSize为0,最大线程数为整形最大值得线程池,

    public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}

线程keepAliveTime为60,单位为秒,缓存队列为SynchronousQueue的线程池。在使用时,放入线程池的任务都会复用或启动新的线程来执行,直到线程数达到整形最大数后抛出异常RejectedExecutionException。与直接实例化Thread来处理的好处就是在60秒内可重用池内已创建的线程。 


3.创建一个大小为1的固定线程池

    public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}
当使用此线程池时,同时执行的任务只有1个,其他任务在LinkedBlockingQueue中,等待轮询执行。


4.创建一个corePoolSize为传入参数,最大线程数为整形的最大数的线程池,此线程池支持定时以及周期性执行任务

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);}
ScheduledThreadPoolExecutor类的构造:

    public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,new DelayedWorkQueue());}
此线程池keepAliveTime参数为0,缓存对列为DelayedWorkQueue。

jdk1.5之前的版本中更多的是借助Timer类来实现,Timer和ScheduledThreadPoolExecutor的区别:

a.Timer单线程运行,一旦任务执行缓慢,下一个任务就会推迟,而如果使用了ScheduledThreadPoolExecutor线程数可以自行控制

b.当Timer中的一个任务抛出异常时,会导致其他所有任务不在执行

c.ScheduledThreadPoolExecutor可执行异步的任务,从而得到执行结果


ScheduledExecutorService接口继承了ExecutorService,在ExecutorService的基础上新增了以下几个方法:



public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);
command:执行的任务 Callable或Runnable接口实现类

delay:延时执行任务的时间

unit:延迟时间单位

示例:

		ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);ScheduledFuture<String> scheduledFuture = executorService.schedule(new Callable<String>() {public String call() throws Exception {return "call";}}, 10, TimeUnit.SECONDS);System.out.println(scheduledFuture.get());executorService.shutdown();

延迟10秒后,返回call字符串并输出。


 public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit);

command:执行的任务 Callable或Runnable接口实现类

initialDelay:第一次执行任务延迟时间

period:连续执行任务之间的周期,从上一个任务开始执行时计算延迟多少开始执行下一个任务,但是还会等上一个任务结束之后。
unit:initialDelay和period时间单位

示例: 注意看输出结果

final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);executorService.scheduleAtFixedRate(new Runnable() {public void run() {System.out.println("时间:" + sf.format(new Date()) );try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}},  2, 3, TimeUnit.SECONDS);

输出结果: 

时间:2014-04-01 23:44:48
时间:2014-04-01 23:44:53
时间:2014-04-01 23:44:58
时间:2014-04-01 23:45:03


public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit);

command:执行的任务 Callable或Runnable接口实现类

initialDelay:第一次执行任务延迟时间
period: 连续执行任务之间的周期,从上一个任务全部执行完成时计算延迟多少开始执行下一个任务
unit: initialDelay和period 时间单位

final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);executor.scheduleWithFixedDelay(new Runnable() {public void run() {System.out.println("时间:" + sf.format(new Date()) );try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}},  2, 3, TimeUnit.SECONDS);
输出结果: 
时间:2014-04-01 23:47:38
时间:2014-04-01 23:47:46
时间:2014-04-01 23:47:54

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

相关文章

【Java多线程】线程池【ExecutorServicec和Executors】

➤ Java多线程编程【一文全解】 背景&#xff1a;经常创建和销毁、使用量特别大的资源&#xff0c;比如并发情况下的线程&#xff0c;对性能影响很大&#xff1b; 思路&#xff1a;提前创建好多个线程&#xff0c;放入线程池中&#xff0c;使用时直接获取&#xff0c;使用完放…

为什么不建议用Executors创建线程池???

来源 | www.cnblogs.com/zjfjava/p/11227456.html 01、通过Executors创建线程池的弊端02、通过ThreadPoolExecutor创建线程池03、ThreadPoolExecutor参数解释04、corePoolSize & maximumPoolSize05、keepAliveTime & unit06、等待队列07、拒绝策略08、ThreadPoolExecut…

Executors和ThreadPoolExecutor详解

概述 在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供&#xff0c;不允许在应用中自行显示的创建线程&#xff0c;这样一方面是线程的创建更加规范&#xff0c;可以合理控制开辟线程的数量&#xff1b;另一方面线程的细节管理交给线程池处理&#xff0c;优化了资…

4.Executor执行器

1.Executor 主体结构 Executor是MyBatis执行者接口&#xff0c;执行器的功能包括&#xff1a; 基本功能&#xff1a;改、查&#xff0c;没有增删的原因是&#xff0c;所有的增删操作都可以归结到改。缓存维护&#xff1a;这里的缓存主要是为一级缓存服务&#xff0c;功能包括…

ExecutorService

本文翻译自http://tutorials.jenkov.com/java-util-concurrent/executorservice.html&#xff0c;人工翻译&#xff0c;仅供学习交流。 ExecutorService java.util.concurrent.ExecutorService接口是一种能够在后台并发执行任务的异步执行机制。本文中&#xff0c;我将会介绍…

Executor概述

在Java类库中&#xff0c;任务执行的主要抽象不是Thread&#xff0c;而是Executor。 public interface Executor {void execute(Runnable command); }它为灵活且强大的异步任务执行框架提供了基础&#xff0c;该框架能支持多种不同类型的任务执行策略。它提供了一种标准的方法…

Executor框架简介

Executor系统中&#xff0c;将线程任务提交和任务执行进行了解耦的设计; 线程被一对一映射为服务所在操作系统线程&#xff0c;启动时会创建一个操作系统线程&#xff1b;当该线程终止时&#xff0c;这个操作系统线程也会被回收 Executor框架包含的核心接口和主要的实现类 具体…

Executors 源码解析(JDK8)

前言 本文隶属于专栏《100个问题搞定Java并发》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见100个问题搞定Java并发 正文 类注释 /*** Factory and util…

Executor框架

转载请以链接形式标明出处&#xff1a; 本文出自:103style的博客 Java并发编程的艺术笔记 并发编程的挑战Java并发机制的底层实现原理Java内存模型Java并发编程基础Java中的锁的使用和实现介绍Java并发容器和框架Java中的12个原子操作类介绍Java中的并发工具类Java中的线程池E…

Executor执行器

分为四个模块&#xff1a; 1.动态代理MapperProxy 2.SQL会话SqlSesson 3.执行器Executor 4.JDBC处理器StatementHandler 现讲述为SQL会话与执行器 一、SQL会话SqlSesson 该门面模式提供一个统一的门面接口API 该模式提供的一个基本API为增删改查&#xff0c;还会提供提…

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

目录 一、Executors的理解二、Executors类图结构二、Executors常用的方法三、线程池的创建分为两种方式&#xff08;主要介绍通过Executors类创建的方式&#xff09;1、newFixedThreadPool方法示例2、newSingleThreadExecutor方法示例3、newCachedThreadPool方法4、newSchedule…

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…