如果我要编写一个Clock应用程序,并且我需要在每一秒后逐字地增加short seconds
值,我可以依赖Thread.sleep(1000)
方法吗?
如果我同时运行数百万个时钟,它会正常工作吗?
答案 0 :(得分:2)
不,你不能依赖Thread.sleep(1000),因为在你的线程实际上下次运行的时候,由CPU调度程序决定。
最重要的是, CPU时间不准确,因此除非与适当的时间服务同步(原子钟),否则您将自然偏离真实时间
但是,如果你真的打算运行“数百万个时钟”,那么你可以更好地使用一个正在更新的计时器,而只是在每个时钟实例中将偏移存储到该计时器。 / p>
此外,通过减少线程休眠的时间并仅在适当时更新秒数,您可以提高准确性。但请注意,如上所述,睡眠时间无法保证。这意味着即使您要求它睡眠10毫秒,技术上也可能不会在10秒内返回(或<<insert arbitrary time here>>
答案 1 :(得分:0)
您通常希望每秒至少更新一次秒数,否则可能几乎与真实时钟不同步。
如果可能的话,从那里你只想让一个线程休眠并更新seconds
值,并拥有需要服务的事件的优先级队列。每次更新时,时钟都会查看优先级队列前面的事件,如果已经到达时间,则处理它并检查下一个事件。
答案 2 :(得分:0)
查看Java Concurrent API包。有许多新API处理多线程和非阻塞算法。
例如,您可以设置[ScheduledExecutorService] [1]并安排每秒运行一次任务,而不是让您的程序调用Thread.sleep(1000)。这将调用您的代码,并使用它来更新您的时钟滴答。这会将您的代码转移到更多的生产者/消费者模型中。
使用Java 5,可以减轻对线程的这种低级访问(即等待/通知)的需求。看一下Java Concurrent包中的一些新东西
[1]:http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)