周期性线程池Executors.newScheduledThreadPool

java周期性线程池newScheduledThreadPool介绍,多线程下载url文件(断点下载、进度展示、网速展示、剩余时间展示) 阅读详情
AI摘要

本文详细介绍了Java并发工具类ScheduledExecutorService的使用,包括构造方法、周期执行、延迟执行等关键方法的示例及执行结果解析,帮助理解其在周期任务和延迟任务中的应用。

newScheduledThreadPool的作用

常用于需要延迟执行或周期循环执行任务的场景

构造方法

ScheduledExecutorService java.util.concurrent.Executors.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

该方法只有两个参数,一个是核心池的大小。另一个是线程工厂。

newScheduledThreadPool常用方法demo

下面的所有的测试demo都使用静态对象,就不重复定义了:

static ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);

周期执行:scheduleAtFixedRate()

方法功能:

scheduleAtFixedRate(command, 5, 2, second):
第一次开始执行是5s后,假如执行耗时1s,那么下次开始执行是7s后,再下次开始执行是9s后。
如果执行耗时>等待时间,那么将会在任务执行完成后立马开始执行下一轮任务。
如果执行耗时<等待时间,那么将会在任务执行完成后等待【等待时间-执行耗时】,然后再执行下一轮任务

执行Demo:

@Test
public void test_scheduleAtFixedRate() throws InterruptedException {
	System.out.println("scheduleAtFixedRate-start:" + new Date());
	// scheduleAtFixedRate(command, 5, 2, second),
	// 第一次开始执行是5s后,假如执行耗时1s,那么下次开始执行是7s后,再下次开始执行是9s后
	// 如果执行耗时>等待时间,那么将会在任务执行完成后立马开始执行下一轮任务。
	// 如果执行耗时<等待时间,那么将会在任务执行完成后等待【等待时间-执行耗时】,然后再执行下一轮任务
	pool.scheduleAtFixedRate(() -> {
		try {
			Thread.sleep(1000L);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("scheduleAtFixedRate:" + new Date());
	}, 5, 2, TimeUnit.SECONDS);
	Thread.sleep(100000L);
}

执行结果:

启动后延迟5秒,然后每2秒执行一次。在这里插入图片描述



周期执行:scheduleWithFixedDelay()

方法功能:

scheduleWithFixedDelay(command, 5, 2, second):
第一次开始执行是5s后,假如执行耗时1s,执行完成时间是6s后,那么下次开始执行是8s后,再下次开始执行是11s后。
它会在任务执行完成后再等待2秒

执行Demo:

@Test
public void test_scheduleWithFixedDelay() throws InterruptedException {
	System.out.println("scheduleAtFixedRate-start:" + new Date());
	// scheduleWithFixedDelay(command, 5, 2, second),
	// 第一次开始执行是5s后,假如执行耗时1s,执行完成时间是6s后,那么下次开始执行是8s后,再下次开始执行是11s后
	// 它会在任务执行完成后再等待2秒
	pool.scheduleWithFixedDelay(() -> {
		try {
			Thread.sleep(1000L);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("scheduleAtFixedRate:" + new Date());
	}, 5, 2, TimeUnit.SECONDS);
	Thread.sleep(100000L);
}

执行结果:

启动后延迟5秒,然后每1(执行耗时)+2(等待时间)秒执行一次。
在这里插入图片描述



延迟执行:schedule()

方法功能:

ScheduledFuture<?> java.util.concurrent.ScheduledExecutorService.schedule(Runnable command, long delay, TimeUnit unit)

在给定的时间之后执行一次。

执行Demo:

@Test
public void test_schedule() throws InterruptedException {
	System.out.println("schedule-start:" + new Date());
	// 在给定的延迟后执行一次
	pool.schedule(() -> {
		System.out.println("schedule:" + new Date());
	}, 2, TimeUnit.SECONDS);
	Thread.sleep(100000L);
}

执行结果:

在2秒钟后执行一次任务,执行完成就结束。
在这里插入图片描述



延迟执行并返回结果:schedule()

方法功能:

ScheduledFuture<?> java.util.concurrent.ScheduledExecutorService.schedule(Runnable command, long delay, TimeUnit unit)

在给定的延迟后执行一次,并阻塞线程等待结果返回

执行Demo:

@Test
public void test_ScheduledFuture() throws InterruptedException, ExecutionException {
	System.out.println("schedule-future-start:" + new Date());
	// 在给定的延迟后执行一次,并返回结果
	ScheduledFuture<Date> future = pool.schedule(() -> {
		return new Date();
	}, 2, TimeUnit.SECONDS);
	System.out.println("schedule-future:" + future.get());
}

执行结果:

在2秒钟后执行一次任务,线程阻塞等待结果返回。执行完成并返回结果后就结束。
在这里插入图片描述



延迟执行并返回结果:submit()

方法功能:

<T> Future<T> submit(Runnable task, T result):
在给定的延迟后执行一次,并阻塞线程等待结果返回,可以将一个对象作为参数传递,执行完成后,再将该对象返回。该对象默认是final的。

执行Demo:

@Test
public void test_submitFuture() throws InterruptedException, ExecutionException {
	System.out.println("schedule-start:" + new Date());
	// 把要返回的对象传递过去,在执行完成后再返回
	Map<String,String> result = new HashMap<String, String>();
	Future<Map<String,String>> future2 = pool.submit(() -> {
		try {
			Thread.sleep(1000L);
		} catch (Exception e) {
			e.printStackTrace();
		}
		result.put("result", "任务执行完成啦");
		System.out.println("schedule:" + new Date());
	}, result);
	System.out.println("执行完成,返回指定的值:" + future2.get());
}

执行结果:

将一个空map作为参数传递。在执行时,向该map对象添加参数,执行完成后,将该对象返回。
在这里插入图片描述

深入剖析Java线程池之“newScheduledThreadPool“ newScheduledThreadPool是Java线程池框架中的一个重要方法,它允许创建定时或周期性执行任务的线程池。通过深入剖析其源码和实现原理,可以更好地理解其工作机制和性能特点。同时,结合高级应用策略,可以更好地利用newScheduledThreadPool来提高系统的性能和稳定性。 阅读详情

相关推荐

ScheduledExecutorService定时周期执行指定的任务

一:简单说明 ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便。 下面是该接口的原型定义 java.util.concurrent.ScheduleExecutorService extendsExecutorService extendsExecut

不积跬步无以至千里,不积小流无以成江海。 20万+

Java多线程(六):线程池详解

目录 1. 什么是线程池 2. 为什么要使用线程池 3. 线程池创建 3.1固定数量的线程池(Executors.newFixedThreadPool) 3.1.1 创建固定数量的线程池 3.1.2线程池返回结果 3.1.3 submit() VS execut() 3.2.4 线程工厂 3.2带缓存的线程池(Executors.newCachedThreadPool) 3.3执行定时任务(Executors.newSingleThreadExecutor) 3.3.1 延迟...

澄白易的博客 6138

GATK SNP过滤参数优化:从标准到个性化调整的实践指南

本文深入探讨了GATK SNP过滤参数的个性化调整策略,强调不应盲目套用官方标准参数。文章详细拆解了QD、FS、SOR等关键过滤参数的含义,并提供了通过数据分布分析、文献调研和迭代测试来确定适合自身数据(如动植物重测序)最佳阈值的实践方法,旨在帮助研究者在保留真实变异与剔除假阳性信号之间找到最优平衡。

weixin_29216049的博客 275

Java使用定时任务

前言:Java开发过程中经常会遇到使用定时任务的情况,比如在某个活动结束时,自动生成获奖名单,导出excel等。常见的有如下四种方式:Timer、ScheduledExecutorService、SpringTask、Quartz。 Java定时任务的四种实现方式 (1)JDK 自带的定时器实现 (2)Quartz 定时器实现 (3)Spring Task相关的任务调度 -JDK自带:JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorService; -...

何哥的博客 5663

如何通过常规测井曲线识别砂岩、泥岩、碳酸盐岩和煤层

常规测井曲线通过不同岩性的物理性质差异识别砂岩、泥岩、碳酸盐岩和煤层。砂岩表现为低自然伽马(GR)、中等密度(RHOB)和声波时差(DT);泥岩以高GR、高中子(NPHI)和高DT为特征;碳酸盐岩显示低GR、高RHOB和低DT;煤层则具有极低RHOB、极高NPHI和DT的独特组合。综合GR与三孔隙度曲线(RHOB、NPHI、DT)可有效区分岩性,其中密度测井对煤层识别最可靠。电阻率(RT)曲线辅助判断流体性质,但需结合其他参数综合分析。

love code, love life. 2591

串口接收完整一帧数据包的3种方法

本文介绍3种使用串口接受一帧完整数据包的方法,串口接收数据是字节接收的,串口每接收1字节数据,产生一个串口中断,我们在中断中将接收到的数据存放到buf中进行保存,但是数据的发送和接收都是按照帧为单位进行传输的,因此我们要在接收数据的同时判断当前接收的数据是否是完整的一帧。 一般串口完整数据帧的定义:帧头(2字节,例如AA、BB) + 数据长度(2字节) + 数据+ CRC16校验(2字节) + 帧尾(2字节) 帧头、帧尾表示一帧数据的开始和结尾,数据长度表示当前数据帧中负载数据大小,CRC16校...

爱吃鱼的猫 6万+

《Java源码分析》:Executors类中创建线程池的几种方法的分析

如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

smart_an的专栏 343

别只盯着Spectre!Cadence Virtuoso里APS和Spectre X该怎么选?一份给模拟IC新手的指南

本文深入解析Cadence Virtuoso中的三大仿真引擎Spectre、APS和Spectre X,帮助模拟IC新手根据电路规模、精度需求和计算资源做出智能选择。通过对比技术指标和应用场景,提供射频电路、混合信号系统和电源管理IC的优化仿真策略,显著提升设计效率。

weixin_26841743的博客 704

java线程池的用法, Executors封装好了四种线程池类型, 核心是ThreadPoolExecutor

Executors --是JDK1.5并发包里面的 Executors 封装好了四种线程池类型: java中使用线程,核心走的是ThreadPoolExecutor。 1) newCachedThreadPool --可缓存的线程池,线程池长度超过处理需要,可灵活回收使用空闲线程,没有空闲的了,可以新建线程。 2)newFixedThreadPool --固定长度的线程池,可控制线程最大并发数 (使用最多) 3) newScheduledThreadPool --定长的线程池,支持定时和周期性任务

m0_70985211的博客 265

增量式PID的P和I怎么理解(一)

增量式PID的P、I理解之推翻片 据我所知的资料里关于PID三个参数的理解是这样的:(我这里只说P和I,先不说D) P的作用:比例P可以加快系统调节速度,P过小调节时间变长,响应性不够,P越大响应性越高超调也越严重,过大的P会使系统振荡。 I的作用:消除静差,提高控制精度,I越大越滞后,过大会使系统振荡。 ...

fangchenglia的博客 1万+

QEMU理解与分析系列(11):QEMU内存机制

在物理机上,CPU 对于内存的访问在保护模式下通过分段分页的形式实现。在该模式下,CPU 访问时使用的是虚拟地址,通过 MMU 映射到物理地址,将虚拟地址转换为物理地址才能访问实际的物理内存。同样的,虚拟机模拟的物理机同样需要有上述的机制,也需要有从虚拟地址到物理地址的转换。这里需要注意,模拟的物理机的物理地址本质上是 qemu 的虚拟地址。

swh547的博客 49

JAVA中创建线程池的五种方法及比较

ThreadPoolExecutor类提供了4种构造方法,可根据需要来自定义一个线程池。

Goals1989的博客 1769

AutoSar实战营 - 总目录

欢迎大家来学习《AutoSar实战营》专栏,该篇为总目录,方便以后大家直接进入需要学习的文章。 ~正所谓独乐乐不如众乐乐 - - ~1, AutoSar之DaVinci开发环境2,BswM模块之Ecu State Handling1)读写DID功能 《AutoSar实战》读写DID之一:CDD准备 《AutoSar实战》读写DID之二:工具链配置 《AutoSar实战》读写DID之三:代码实现2)功能寻址 《AutoSar实战》禁止功能寻址

weixin_48498880的博客 3626

JAVA4种线程池的使用

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

qq_21479345的博客 207

流体动力学仿真软件:SU2_(1).SU2简介与安装

SU2 是一个开源的计算流体动力学(CFD)和计算结构动力学(CSD)仿真软件,由斯坦福大学的航空航天系开发。它主要用于解决流体动力学问题,包括但不限于空气动力学、热力学、化学反应流等。SU2 的特点在于其高度的灵活性和可扩展性,使其成为科研和工业领域中非常受欢迎的工具。SU2 采用有限体积法(FVM)和有限元法(FEM)进行数值求解,支持多种物理模型和求解器,如 Euler 方程、Navier-Stokes 方程、RANS 方程等。

kkchenjj的博客 1313

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

线程池创建的四种_一篇文章快速搞懂Java中常用的四种线程池

在Java中使用线程池,可以用ThreadPoolExecutor的构造函数直接创建出线程池实例,如何使用参见之前的文章Java线程池构造参数详解。不过,在Executors类中,为我们提供了常用线程池的创建方法。接下来我们就来了解常用的四种:newFixedThreadPool首先,看一下这种线程池的创建方法:publicstaticExecutorServicenewFixedThrea...

weixin_39897070的博客 184

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java 多线程 线程池

经济学家用一个公式表达复利效应:(1+r)^n,r 代表你正在做的事,n 代表时间,只要 r 为正,即你在做正确的事,时间就会为你带来奇迹。

这里是菠萝味菠萝啤的博客 354

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

线程池简介()

线程池应用

qq_42577109的博客 139

java.util.concurrent.Executors源码学习(三)

Executors中的重要方法(续): 8. ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) 创建一个计划任务线程池,池中的worker线程数中有一个。处理的任务放在一个延迟任务队列(DelayedWorkQueue)中,产生新线程的工厂为threadFacto...

windcpp的专栏 128

多线程:简单了解几种常见的线程池

接口

95年的巨蟹 755

Java四种线程池的使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34018202的博客 72

线程池使用

线程池(来自百度百科) 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如,线程数一般取cpu数量+2比较合适,线程数过多...

suchenbin的博客 246

线程题---什么是线程池?

线程题—什么是线程池? 概念性的知识,上来就是整,读个三五遍熟悉一下,然后就背下来,简单、粗暴、有效。 在面向对象编程中,创建和销毁对象是非常浪费时间的,因为创建一个对象要获取内存资源或者其他更多的资源。在java中更是如此,因为虚拟机将试图跟踪每一个对象,以便于当对象销毁时,进行垃圾回收,所以尽量少的创建和回收垃圾,是提高服务程序效率的一个重要手段,特别是一些很消耗资源的对象的创建和销毁,这就“池化技术”诞生的原因。 线程池,顾名思义就是实现创建出很多个可执行线程的池子(容器),需要的时候从池子中获取线程

qq_44872907的博客 145

自定义 ThreadPoolExecutor 线程池

如何才是最优雅的方式去使用过线程池吗?生产环境要怎么去配置自己的线程池才是合理的呢?需要对症下药,建立自己的线程工厂类,灵活设置关键参数。

weixin_37799575的博客 822

线程池

Executors类提供了4种不同的线程池:newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool, newSingleThreadExecutor 1、newCachedThreadPool:用来创建一个可以无限扩大的线程池,适用于负载较轻的场景,执行短期异步任务。(可以使得任务快速得到执行,因为任务时间执行短,可以很快结束...

w517272812的博客 267

Java并发 ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor详解

weixin_43735400的博客 564
上一篇: 类加载器以及类加载的双亲委派模型
下一篇: Executors提供的四种线程池
村口老师傅
博客等级 码龄9年 67粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值