栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

一段时间内运行代码的更好方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一段时间内运行代码的更好方法

如果您使用的是Java5或更高版本,请考虑

ScheduledThreadPoolExecutor
Future
。使用前者,您可以安排任务在指定的延迟后或以指定的时间间隔运行,因此,它可以
Timer
更可靠地接管的角色。

Timer
设施管理延迟(“每100毫秒运行一次此任务”)和定期(“每10毫秒运行此任务”)任务的执行。但是,它
Timer
有一些缺点,
ScheduledThreadPoolExecutor
应将其视为替代品。[…]

A

Timer
仅创建一个用于执行计时器任务的线程。如果计时器任务花费的时间太长,则其他计时器的计时精度
TimerTask
可能会受到影响。如果
TimerTask
安排一个重复执行周期为每10毫秒运行一次,而另一个
TimerTask
重复运行则需要40毫秒运行,则长时间运行的任务完成后,重复执行的任务(取决于是以固定速率还是固定延迟计划)将被快速连续调用四次。
,或完全“缺失”四个调用。计划线程池通过允许您提供多个线程来执行延迟和定期任务来解决此限制。

另一个问题

Timer
是,如果
TimerTask
抛出未经检查的异常,它的行为就会很差。该
Timer
线程不会捕获该异常,因此从a引发的未经检查的异常将
TimerTask
终止计时器线程。
Timer
在这种情况下也不会恢复线程;而是错误地认为整个都
Timer
被取消了。在这种情况下,
TimerTask
已调度但尚未执行的永远不会运行,并且无法调度新任务。

摘自Java Concurrency inPractice第6.2.5节。

Future
小号可以限制运行最多在指定的时间(扔
TimeoutException
如果不能按时完成)。

更新资料

如果您不喜欢上述内容,则可以使任务衡量其自身的执行时间,如下所示:

int totalTime = 50000; // in nanosecondslong startTime = System.getNanoTime();boolean toFinish = false;while (!toFinish) {    System.out.println("Task!");    ...    toFinish = (System.getNanoTime() - startTime >= totalTime);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438159.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号