Java实现延迟执行代码
Java实现延迟执行代码
对于Java程序在它们的操作中添加延迟或暂停是比较常见的。这对于任务暂停直到另外任务完成执行场景比较有用。本文我们提供两类方法实现延迟执行。
1. 基于线程(Thread)方法
当Java查询运行时,它在操作系统上产生一个进程,其至少包含一个线程————主线程负责查询运行。而且,Java支持多线程,程序可以创建新的线程与主线程并行或异步执行。
1.1. 使用Thread.sleep
Java中一种快速却不可靠的暂停方式是让当前线程休眠一定时间。使用Thread.sleep(milliseconds)来完成:
try {
Thread.sleep(secondsToSleep * 1000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
使用try…catch捕获sleep方法的异常是很好的实践方式。上面示例捕获InterruptedException并显示中断当前线程,为了后续处理。这在多线程程序非常重要。
1.2. 使用TimeUnit.sleep
使用TimeUnit.XXX.sleep(y),可读性更好,其中xxx是休眠的时间单位,如SECONDS, MINUTES等,y是数量。其背后还是使用Thread.sleep,请看示例:
try {
TimeUnit.SECONDS.sleep(secondsToSleep);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
使用基于线程方式有几个缺点:
休眠时间不精确,特别是当时间增量较小时,如毫秒、纳秒。
当在循环内部使用,休眠在循环迭代之间会稍微漂移,因为其他代码执行导致多次迭代后执行时间不够精确。
2. 基于ExecutorService方法
Java提供了ScheduledExecutorService接口是更强大、精确的解决方案。接口可以安排代码在指定的延迟或固定的时间间隔后运行一次。要在延迟之后运行一段代码,我们可以使用schedule方法:
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);
Classname::someTask 部分是指定特定方法延迟执行。
- someTask是执行方法的名称
- Classname是包括someTask方法的类名称
以固定时间间隔执行,可以使用scheduleAtFixedRate :
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);
这会重复调用someTask方法,每次调用后暂停delayInSeconds秒。除了允许更多的计时选项之外,ScheduledExecutorService方法还可以产生更精确的时间间隔,因为它可以防止漂移问题。
Java实现延迟执行代码的更多相关文章
- Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353)
Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353) 一.漏洞描述 该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中,jenkins利用此通道来接收命令,恶 ...
- iOS 延迟执行代码
//延迟执行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)),dispatch_get_main ...
- unity, 延迟执行代码
使用协程实现比较方便,可以带参数. void Start(){ StartCoroutine(delayLaunchRocket(rocket,2.0f)); } IEnumerator delayL ...
- lambda高级进阶--延迟执行
前面的整理我们也已经说到了,使用lambda表达式的主要原因是,将代码的执行延迟到一个合适的时间点.在使用lambda表达式的时候务必记住一点就是说lambda表达式都是延迟执行的. 延迟执行代码的原 ...
- 使用lambda编程之延迟执行
使用lambda表达式的主要原因是,将代码的执行延迟到一个合适的时间点. 所有的lambda表达式都是延迟执行的.毕竟,如果你希望立即执行一段代码,那就没有必要使用lambda表达式了.延迟执行代码的 ...
- Java面试题 静态代码块 构造代码块 构造方法 的执行顺序
JAVA中的静态代码块 构造代码块 构造方法执行顺序: 静态代码块(类加载时执行)>>构造代码块>>构造方法 下面展示一个简单的例子,推荐大家动手运行一遍: public cl ...
- java动态编译 (java在线执行代码后端实现原理)(二)
在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...
- java动态编译 (java在线执行代码后端实现原理)
需求:要实现一个web网页中输入java代码,然后能知道编译结果以及执行结果 类似于菜鸟java在线工具的效果:https://c.runoob.com/compile/10 刚开始从什么概念都没有到 ...
- java Web 启动时自动执行代码的几种方式
Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置 ...
- iOS 代码延迟执行
1. [NSTread sleepForTimeInterval:0.8f] 这个方法 实际效果 好比打断点 等你再恢复断点执行 2. [self performSelector:@selector ...
随机推荐
- Serverless Kubernetes 落地实践
简介:如何通过原生 Kubernetes 提供 Serverless 能力?如何借力丰富的云原生社区生态?本文将给大家介绍一下我们在 Serverless Kubernetes 上的落地实践. 作者 ...
- dotnet 6 已知问题 ManualResetEventSlim 的 Set 方法抛出空异常
本文记录一个 dotnet 6 已知问题,此问题预计是在 .NET Framework 4.5 时就引入的,我没有考古在 .NET Framework 4.5 之前是否还存在此问题.当前这个问题在 . ...
- WPF 获取全局所有窗口的创建显示事件 监控窗口打开
本文将告诉大家如何在 WPF 里面进行全局监控任意的窗口创建显示打开,可以获取到每个 WPF 窗口的打开的时机.如此可以用来辅助定位问题和输出日志 这篇博客是有背景的,老司机告诉我说他的应用不响应鼠标 ...
- IIS 部署 docsify
来源:https://www.cnblogs.com/yokeqi/p/14276176.html 来源:https://sspai.com/post/60534 docsify之前部署在Linux+ ...
- Stable Diffusion中的embedding
Stable Diffusion中的embedding 嵌入,也称为文本反转,是在 Stable Diffusion 中控制图像样式的另一种方法.在这篇文章中,我们将学习什么是嵌入,在哪里可以找到它们 ...
- 微软开源 MS-DOS「GitHub 热点速览」
上周又是被「大模型」霸榜的一周,各种 AI.LLM.ChatGPT.Sora.RAG 的开源项目在 GitHub 上"争相斗艳".这不 Meta 刚开源 Llama 3 没几天,苹 ...
- 【HarmonyOS】安装DevEco Studio后检查环境出现ohpm not set up
按照官网的操作方式,下载完ohpm总是检测不到 打开cmd,发现我之前因为其他项目改过编码 输入 regedit 打开注册表编辑页 按路径[计算机\HKEY_LOCAL_MACHINE\SOFTWAR ...
- Linux下ffmpeg库的编译链接
/usr/bin/ld: /usr/local/ffmpeg/lib/libavformat.a(aviobuf.o): in function `ff_crc04C11DB7_update':/ho ...
- Python 潮流周刊#49:谷歌裁员 Python 团队,微软开源 MS-DOS 4.0
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 荒岛野人Savage
题目描述 样例 3 1 3 4 2 7 3 3 2 1 6 分析 首先,我们先设4个变量,初始坐标 \(d[i]\),每年步数 \(p[i]\),寿命 \(l[i]\),根据题目很容易得到一个不等式 ...