[英]Erratic behavior with ScheduledExecutorService
我正在尝试在我正在开发的应用程序上使用ScheduledExecutorService,但我得到了一个不稳定的行为,无法弄清楚我是否做错了或者这是一个已知的问题。 我在文档上尝试了这个例子:
class BeeperControl {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void beepForAnHour() {
final Runnable beeper = new Runnable() {
public void run() {
System.out.println("beep");
}
};
final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
beeper, 10, 10, TimeUnit.SECONDS);
scheduler.schedule(new Runnable() {
public void run() {
beeperHandle.cancel(true);
}
}, 60 * 60, TimeUnit.SECONDS);
}
public static void main(String[] args) {
new BeeperControl().beepForAnHour();
}
}
但是这只会在10分钟内打印出4次'嘟嘟'值,此时它应该每10秒打印一次。 有人可以给我一些帮助吗?
亲切的问候,
卡洛斯费雷拉
编辑:
我在打印指令中添加了更多信息,并在2台不同的机器上运行代码,一台使用Windows XP,另一台使用Unix,查看结果:
UNIX
在10月17日星期一13:31:34 2011年西部
在10月17日星期一13:31:44西2011年发出哔哔声
在2011年10月17日星期一13:31:54发出哔哔声
在10月17日星期一13:32:04 2011年的西部
在10月17日星期一13:32:14 2011年西部发出哔哔声
在10月17日星期一13:32:24西2011年发出哔哔声
在10月17日星期一13:32:34 2011年西部发出哔哔声
Windows XP
在2011年10月17日星期一13:24:21 BST发出哔哔声
在2011年10月17日星期一13:25:54发出哔哔声
在10月17日星期一13:27:08 BST 2011发出哔哔声
在2011年10月17日星期一13:28:03发出哔哔声
2011年10月17日星期一13:28:48发出哔哔声
在2011年10月17日星期一13:29:40发出哔哔声
在10月17日星期一13:30:31 BST发出哔哔声
本文是理解问题的一个很好的起点。 基本上,Windows定时器有问题。 jdk ScheduledExecutorService实现利用java中基于“纳米时间”的API,这是有问题的。 我们必须更改我们的代码,以便它在Windows上使用java.util.Timer
(它使用基于毫秒的API并且似乎在Windows上可靠地工作)和其他地方的ScheduledExecutorService。
代码工作得非常好。 你可能会感觉到另一种方式:1)API说
创建并执行一个周期性操作,该操作在给定的初始延迟后首先启用,随后在给定的时间段内启用; 即执行将在initialDelay之后开始,然后是initialDelay + period,然后是initialDelay + 2 * period,依此类推。 这回答了这种行为。
2)`scheduler.schedule(new Runnable(){
public void run() {
beeperHandle.cancel(true);
}
}, 60*60, TimeUnit.SECONDS);
即1小时。 因此大约一个小时它将显示输出。 3)即使你把时间从60 * 60改为10,它仍然不会终止。 因为从不调用shutdown。
scheduler.schedule(new Runnable() {
public void run() {
beeperHandle.cancel(true);
scheduler.shutdown();
}
}, 10, TimeUnit.SECONDS);
现在它将正常终止
Hava看看这篇文章 。 它讨论了一个非常类似的问题。 这可能有助于找出真正的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.