并发编程:自定义并发类:5、自定义周期调度任务

Swift语言的并发编程 Swift的并发编程是一个强大且必要的特性,它让开发者以更直观的方式处理异步任务。这种新模型不仅简化了代码的结构,提高了开发效率,同时也提高了应用的响应速度和性能。随着Swift语言及其并发特性的不断演进,开发者应充分利用这些功能,提升应用的用户体验。希望本文能为在Swift中进行并发编程的开发者提供一些有价值的见解和实用的示例。 阅读详情

目录

ScheduledThreadPoolExecutor

一、主程序

二、自定义周期线程池

三、自定义周期任务类

四、一个被执行的普通任务

五、执行结果


ScheduledThreadPoolExecutor

周期调度性线程池(Scheduled thread pool)是一个Executor框架的基本线程池的拓展。

  • 延迟任务(Delayed task):在一段时间后执行一次。(可执行Callable和Runnable对象)
  • 周期任务(Periodic task):在一段时间后,永久地周期性地执行。(只能执行Runnable对象)

一、主程序

package xyz.jangle.thread.test.n8_6.schedule;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * 	8.6、自定义在周期调度线程池中运行的任务类
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月25日 上午9:20:05
 * 
 */
public class M {

	public static void main(String[] args) throws Exception {
		// 使用自定义周期线程池
		MyScheduledThreadPoolExecutor executor = new MyScheduledThreadPoolExecutor(4);
		Task task = new Task();
		System.out.println("Main: " + new Date());
		executor.schedule(task, 1, TimeUnit.SECONDS);
		TimeUnit.SECONDS.sleep(6);
		task = new Task();
		System.out.println("Main:" + new Date());
		executor.scheduleAtFixedRate(task, 1, 3, TimeUnit.SECONDS);
		TimeUnit.SECONDS.sleep(10);
		executor.shutdown();
		executor.awaitTermination(1, TimeUnit.DAYS);
		System.out.println("Main:End of the program.");
	}

}

二、自定义周期线程池

package xyz.jangle.thread.test.n8_6.schedule;

import java.util.concurrent.RunnableScheduledFuture;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 *  自定义(继承重写)周期调度线程池
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月25日 下午3:15:44
 * 
 */
public class MyScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor {

	public MyScheduledThreadPoolExecutor(int corePoolSize) {
		super(corePoolSize);
	}

	@Override
	protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task) {
		// 该方法会被 schedule、scheduleAtFixedRate、scheduleWithFixedDelay 方法内部调用
		// 这个方法的任务是对原任务进行包装。
		// 包装后的任务必须是实现RunnableScheduledFuture接口的类(因为线程池需要判断是否是周期任务)
		return new MyScheduledTask<V>(runnable, null, task, this);
	}

	@Override
	public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
		// scheduleAtFixedRate 方法会调用decorateTask方法,所以会返回MyScheduledTask类型的对象
		ScheduledFuture<?> task = super.scheduleAtFixedRate(command, initialDelay, period, unit);
		MyScheduledTask<?> myTask = (MyScheduledTask<?>) task;
		myTask.setPeriod(TimeUnit.MILLISECONDS.convert(period, unit));
		return myTask;
	}

}

三、自定义周期任务类

在周期调度执行器中执行的任务必须实现RunnableScheduledFuture接口并拓展FutureTask类。

package xyz.jangle.thread.test.n8_6.schedule;

import java.util.Date;
import java.util.concurrent.Delayed;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 *  自定义在周期调度线程池中运行的任务类
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月25日 上午9:22:49
 * 
 */
public class MyScheduledTask<V> extends FutureTask<V> implements RunnableScheduledFuture<V> {
	// 原任务
	private RunnableScheduledFuture<V> task;
	// 线程池
	private ScheduledThreadPoolExecutor executor;
	// 运行周期
	private long period;
	// 用于周期任务(开始执行的时间)
	private long startDate;

	public MyScheduledTask(Runnable runnable, V result, RunnableScheduledFuture<V> task,
			ScheduledThreadPoolExecutor executor) {
		super(runnable, result);
		this.task = task;
		this.executor = executor;
	}

	@Override
	public long getDelay(TimeUnit unit) {
		if (!isPeriodic()) {
			return task.getDelay(unit);
		} else {
			if (startDate == 0) {
				return task.getDelay(unit);
			} else {
				var now = new Date();
				long delay = startDate - now.getTime();
				long res = unit.convert(delay, TimeUnit.MILLISECONDS);
//				System.out.println("******delay:" + delay + ",res" + res);
				return res;
			}
		}
	}

	@Override
	public int compareTo(Delayed o) {
		return task.compareTo(o);
	}

	@Override
	public boolean isPeriodic() {
		return task.isPeriodic();
	}

	@Override
	public void run() {
		if (isPeriodic() && (!executor.isShutdown())) {
			var now = new Date();
			startDate = now.getTime() + period;
			executor.getQueue().add(this);
		}
		System.out.println("MyScheduledTask-Pre:" + new Date());
		System.out.println("MyScheduledTask: 是否是周期性任务:" + isPeriodic());
		super.runAndReset();
		System.out.println("MyScheduledTask-Post:" + new Date());
		System.out.println("*************************");
	}

	public void setPeriod(long period) {
		this.period = period;
	}

}

四、一个被执行的普通任务

package xyz.jangle.thread.test.n8_6.schedule;

import java.util.concurrent.TimeUnit;

/**
 *  普通的任务
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月25日 下午4:02:28
 * 
 */
public class Task implements Runnable {

	@Override
	public void run() {
		System.out.println("Task: Begin.");
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Task: End.");
	}

}

五、执行结果

Main: Sat Oct 03 09:23:16 CST 2020
MyScheduledTask-Pre:Sat Oct 03 09:23:17 CST 2020
MyScheduledTask: 是否是周期性任务:false
Task: Begin.
Task: End.
MyScheduledTask-Post:Sat Oct 03 09:23:19 CST 2020
*************************
Main:Sat Oct 03 09:23:22 CST 2020
MyScheduledTask-Pre:Sat Oct 03 09:23:23 CST 2020
MyScheduledTask: 是否是周期性任务:true
Task: Begin.
Task: End.
MyScheduledTask-Post:Sat Oct 03 09:23:25 CST 2020
*************************
MyScheduledTask-Pre:Sat Oct 03 09:23:26 CST 2020
MyScheduledTask: 是否是周期性任务:true
Task: Begin.
Task: End.
MyScheduledTask-Post:Sat Oct 03 09:23:28 CST 2020
*************************
MyScheduledTask-Pre:Sat Oct 03 09:23:29 CST 2020
MyScheduledTask: 是否是周期性任务:true
Task: Begin.
Task: End.
MyScheduledTask-Post:Sat Oct 03 09:23:31 CST 2020
*************************
Main:End of the program.

 

并发编程第一阶段 提示:并发编程给我们带来了什么作用可以加快响应用户的时间、使你的代码模块化,异步化,简单化、充分利用CPU的资源提示:以下是本篇文章正文内容,下面案例可供参考Future和FutureTask可以和Callable配合使用Callable的Call方法有返回值,可以声明抛出异常Future对具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时通过get方法阻塞任务返回结果。Future实际采用FutureTask实现。 阅读详情

相关推荐

【并发编程】线程调度线程池

Java 中 ScheduledExecutorService接口定义调度线程池,newSingleThreadScheduledExecutor类实现了该接口,用于创建一个独立线程的调度线程池。它适合用于需要按计划执行任务的场景,并且任务之间不需要并行。

GM_115的博客 704

【阿里开发规范】ThreadPoolExecutor自定义线程池示例(亲测)

【阿里开发规范】ThreadPoolExecutor自定义线程池示例(亲测)

zss123yq的博客 6537

深入理解 Java 并发编程:从理论到实践的全面指南

《Java并发编程核心技术解析》摘要:本文系统讲解Java并发编程核心知识,涵盖线程基础、内存模型、线程安全三大特性(原子性/可见性/有序性)及volatile/synchronized原理。重点解析并发工具类(线程池/同步容器/闭锁/信号量)的使用场景与实现机制,并深入探讨高级主题如线程通信、原子操作类及并发设计模式。针对死锁、活锁等常见问题提供解决方案,给出减少锁竞争、优化线程池等性能调优策略。通过理论结合实践的方式,帮助开发者掌握编写高效安全并发程序的技能,适应多核处理器时代的开发需求。

2503_91057718的博客 1140

基于ScheduledThreadPoolExecutor线程池的周期性任务、延时自定义封装

基于ScheduledThreadPoolExecutor线程池的周期性任务、延时自定义封装

qq_36365860的博客 620

【Java学习】5个状态揭秘线程生命周期:并发编程的深度解析与实战指南

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。

java专栏 1303

深入SVT SPI VIP配置:如何灵活控制CS间隔、数据帧大小与时钟频率(含代码片段)

本文深入探讨了SVT SPI VIP的高级配置技巧,包括精确控制CS信号间隔、突破数据帧大小限制以及动态时钟频率切换。通过实战代码片段和详细配置步骤,帮助验证工程师灵活应对复杂SPI协议验证场景,提升验证效率和覆盖率。特别适合需要处理非标准SPI时序和特殊数据帧的芯片验证项目。

weixin_27014595的博客 280

Java ExecutorService 中的 `awaitTermination()` 原理

如果在指定时间内未完成所有任务,可以选择调用 shutdownNow() 来强制关闭正在执行的任务。:时间单位,如 TimeUnit.SECONDS、TimeUnit.MILLISECONDS 等。抛出异常:InterruptedException,当等待过程被中断时抛出。:最大等待时间,表示阻塞等待的时长。:所有任务在规定时间内已执行完毕。:超时仍有任务未完成。

weixin_45535978的博客 1488

手把手教你用TJA1145A实现CAN节点智能唤醒(含数据帧过滤技巧)

本文详细介绍了如何使用TJA1145A收发器实现CAN节点的智能唤醒功能,包括数据帧过滤技巧和超低功耗设计。通过硬件级帧过滤和双条件唤醒机制,TJA1145A在保持微安级休眠电流的同时,能对特定报文做出毫秒级响应,显著提升电池供电设备的续航能力。

weixin_28721917的博客 249

Java自定义线程池-ThreadPoolExecutor

Java-ThreadPoolExecutor自定义线程池

致终将逝去的编程青春 1774

黑金AXU9EG开发板深度学习部署全流程解析

本文详细解析了黑金AXU9EG开发板的深度学习模型部署全流程,从环境搭建、模型转换到上板验证,提供了实用的技术指导和优化技巧。该开发板基于Xilinx Zynq UltraScale+ MPSoC架构,特别适合边缘计算场景,通过FPGA加速实现高效AI推理。

weixin_29062613的博客 447

手把手教你用ROS2控制PX4无人机画个圆:从C++代码到Gazebo仿真全流程解析

本文详细解析了如何使用ROS2控制PX4无人机实现圆形轨迹飞行,涵盖从C++代码编写到Gazebo仿真的全流程。重点介绍了Offboard模式下的控制算法实现、圆形轨迹生成的数学原理,以及解决通信延迟和坐标系转换等常见问题的实用技巧。通过实战案例,帮助开发者快速掌握无人机轨迹跟踪仿真的核心技术。

weixin_30839881的博客 95

JAVA多线程问题 — 基于Executor自定义线程池内的延迟和周期性任务

基于 Executor自定义线程池内的延迟和周期性任务 基于 Executor自定义线程池内的延迟和周期性任务,它通过 ScheduledThreadPoolExecutor 类来实现,并允许运行以下这两种任务: Delayed 任务:延迟运行一个任务 Executor框架提供ThreadPoolExecutor类,使用池中的线程来执行Callable和Runnable任务,这样可以避免所有线程的创建操作。当你提交一个任务给执行者,会根据执行者的配置尽快执行它。在有些使用情况下,当你对尽快执行任务不感觉兴

qq_38658567的博客 1144

单片机毕业设计-基于STM32单片机的智能镜系统-仿真设计

可通过MQ-2监测当前烟雾浓度可通过温湿度传感器监测当前温湿度可通过光照强度传感器监测光照强度可通过蜂鸣器进行烟雾报警可通过语音识别模块进行反馈播报状态可通过按键设置阈值三个继电器控制灯、加湿、风扇标签:STM32单片机、OLED112864、DHT11、BH1750、继电器、SU-03T、MQ-2、蜂鸣器题目扩展:智能家居安防、智能大棚控制系统、智能环境检测系统项目编号:ZL-32-240604-FZ。

bsdog11的博客 964

Go并发编程实践:WatchYourLAN扫描任务调度机制

在现代网络管理中,实时IP扫描是保障网络安全与监控的关键环节。传统扫描工具常面临**资源占用过高**、**响应延迟**和**任务调度混乱**三大痛点。WatchYourLAN作为轻量级网络IP扫描工具(Lightweight network IP scanner with web GUI),基于Go语言实现了高效的并发任务调度机制,通过goroutine与channel的精妙配合,将扫描任务的CP...

gitblog_00229的博客 903

【2025华为OD机考真题】- 简易内存池(B卷-200分)(C版)

🔔本文收录于「最新最全华为OD机试真题(C版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅

**My Coding Family** 960

uniapp - Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not suppo

Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not supported for code-splitting builds. uniapp 编译报错,vite vue3 Hbuilder 中编译报错,uniapp 打包 App 报错(vue3)hbuilder提示错误,uniapp运行到手机/模拟器 App 报错(vue3)uniapp项目启动报错,如何解决这个问题,安卓app,苹果app

🏆 前端领域优质创作者 3964

【仓颉实战】高性能并发编程:协程、通道与分布式任务调度

本文深入探讨仓颉语言的高性能并发编程范式,重点介绍协程、通道通信和分布式任务调度等核心技术。文章包含以下核心内容: 并发基础:对比并发与并行概念,解析仓颉的CSP模型设计哲学 协程机制:详解轻量级协程的创建、生命周期管理及状态转换 通信模型:通过通道实现安全高效的协程间通信 实战应用:构建分布式Web爬虫系统,展示架构设计与性能优化 关键特性包括: 用户级协程调度(ns级切换) 类型安全的通道通信 分布式任务调度器 高性能并发安全机制 通过代码示例展示了协程创建、状态管理和错误处理的最佳实践,为构建高并发系

2302_80663569的博客 1198

Python 爬虫实战:付费 IP 代理使用技巧与爬虫稳定性优化

付费IP代理实战指南:突破反爬与优化稳定性 本文系统讲解付费IP代理在爬虫项目中的高效应用方法。首先对比分析静态代理、动态代理和隧道代理的优缺点及适用场景,推荐高并发项目优先选择隧道代理。然后详细演示了主流代理服务商的集成方法,包括代理池的自动更新和健康检测机制。核心部分重点介绍了爬虫稳定性优化策略,如智能重试、频率控制和请求间隔优化等关键技术。最后通过压力测试验证优化效果,并提供成本控制方案,包括代理复用、错峰爬取等实用技巧。通过本教程,开发者可有效解决高并发爬虫中的IP封禁问题,显著提升系统稳定性和抗风

2503_91057718的博客 2448

关于Java并发编程的总结和思考

编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的一点总结和思考,同时也分享了Java 5以后的版本中如何编写并发代码的一点点经验。

骆昊的技术专栏 16万+

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

并发编程:Java高效多线程实战指南

并发编程是现代软件开发中的关键技术,尤其在Java中,它通过多线程机制实现任务的高效执行。并发与并行的主要区别在于任务执行方式:并发是任务交替执行,适用于单核CPU;并行是任务同时执行,依赖多核CPU。

m0_71744084的博客 2880

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

玩转-并发编程

使用线程池,可以复用线程及控制线程的总量。如果不使用线程池,每个任务都要新开一个线程来处理,反复创建线程开销大,过多的线程会占用太多内存。ThreadLocal 为每个线程维护一个本地变量。采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个 副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本突。ThreadLocal 类中维护一个 Map,用于存储每一个线程的变量副本,Map 中元素的键为线程对象,而值为对应线程的变量副本。

yinbaoli的博客 1518

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java并发编程

并发:同时有多个请求并发执行:在一个时间段内对多个请求依次执行并行执行:在一个时间点上,有多个任务同时执行并发编程:在用户高并发访问场景下(卖票,秒杀,抢购),我们要让程序并发执行本质解决的就是多线程对共享资源的访问出现的问题JMM为每个线程设置了内存(工作内存)作为高速缓存,导致的不可见性问题,编译优化带来的乱序性问题,线程切换带来的非原子性问题其实缓存、线程、编译优化的目的和我们写并发程序的目的是相同的,都是提高程序安全性和性能。

Vaclee的博客 818

java并发编程

什么是java并发编程如何进行并发编程

m0_64021225的博客 1724

【JUC并发编程】5 定时任务线程池ScheduledThreadPoolExecutor的使用

ScheduledThreadPoolExecutor介绍 ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后执行任务,或者定期执行任务。通常使用工厂类Executors来创建。 ScheduledThreadPoolExecutor的功能与Timer类似,但比Timer更强大,更灵活,Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。 2.Sc

健身变秃,coding变强 1万+

并发编程的挑战

学以致用,方得始终。

qq_38248841的博客 1万+
上一篇: 并发编程:自定义并发类:3、使用指定的线程工厂创建线程池
下一篇: 并发编程:自定义并发类:6、自定义的fork/join线程类(拓展ForkJoinWorkerThread)
博风
博客等级 码龄16年 442粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值