2011-01-26 110 views
1

如果我会写一个时钟应用程序,我需要增加short seconds字面值每秒钟后我可以依靠Thread.sleep(1000)方法吗?什么是计算时间跨度的最佳方法?

将它正常工作,如果我将有百万同时运行的时钟?

+2

@AndriodNoob,这个问题是最适合的StackOverflow,不是P.SE – 2011-01-26 19:34:18

回答

2

不,你不能依靠了Thread.sleep(1000),因为它是到CPU调度程序来当你的线程实际是下一次运行。

最重要的是,CPU时序是不完全准确的,所以你会得到真正的从自然时间偏差,除非你一个适当的时间服务(原子钟)同步。尽管如此,如果你确实打算运行'数百万个时钟',那么最好有一个正在更新的计时器,并且仅在每个时钟实例中存储该计时器的偏移量。

而且,通过还原线程睡眠的时间和更新秒只作为适当,可以增加你的准确度。不过请注意,如上所述,睡眠时间为不保证。这意味着即使您要求它睡10ms,技术上也有可能在10秒内不返回(或者,<<insert arbitrary time here>>

0

您通常希望每秒至少更新一次秒数,否则它可以是几乎整个第二不同步的实时时钟。

如果可能的话,从那里你想有只一个线程睡眠和更新seconds值,并有事件的优先级队列需要提供服务每次更新,时钟都会查看优先级队列前面的事件,如果您已经到了它的时间,则对其进行处理并检查下一个。

0

查看Java Concurrent API包。有许多新的API处理多线程和非阻塞算法。

例如,而不是你的程序调用了Thread.sleep(1000),你可以建立一个[ScheduledExecutorService的] [1],并安排运行每秒的任务。这会调用你的代码,并用它来更新你的时钟滴答。这将您的代码移到更多的生产者/消费者模型中。

与Java 5,需要这样的低级别的访问线程(即等待/通知)得到缓解。看看在Java并发包了一些新的东西

[1]:http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,很长很长,java.util.concurrent.TimeUnit中)

相关问题