繁体   English   中英

ScheduledExecutorService的不稳定行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM