1ms Java定时器延迟太快了吗?

时间:2016-01-04 15:45:31

标签: java timer

Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 1);  // 1 = 1ms delay between each iteration

每次触发它都会运行一个超快速操作,它基本上不需要时间:基本上它需要当前毫秒经过的值,并在以毫秒为关键的Map中快速查找时递增它。

你认为1ms的延迟会太快吗?这是否会使系统陷入困境?尝试使用这款超级快速计时器有什么危险吗?

3 个答案:

答案 0 :(得分:5)

也许。在当代计算机上,很多事情都可以在一毫秒内完成,因此它取决于很多事情。您可能应该找出可接受的最慢速率,然后选择1和该数字之间的合理值。这将每天执行更多约86,400,000次。这对你想要完成的事情有意义吗?

编辑:作为问题说明的一些评论,如果您假设计时器将始终以您提供的速率执行,则此方法可能存在根本缺陷。无论速率如何,你都无法做出这种假设。很难说,因为细节很少,但我觉得你应该考虑使用队列而不是地图。

答案 1 :(得分:2)

取决于

问自己这些问题:

  • 我有多久需要要检查该值?
  • 接受的速度有多快?
  • 你有多少系统CPU时间愿意牺牲来完成这项任务?

一毫秒可能很长(高端游戏PC)或非常非常短(老一代智能手机),并且根据您的CPU架构,您最终会填充众多核心之一或计算时差的唯一核心

对于您的数据结构:您可能需要类似于排序映射的内容,其中包含start作为键,持续时间作为值的一个字段。您将获取最接近的密钥少于您的时间,并检查存储的标题是否仍然有效......或类似的

答案 2 :(得分:0)

“你认为1ms的延迟会太快吗?” - 是的,并且它无法在每毫秒(特别是在加载时)启动任务,您可以自己测试(下面的小例子)。

“这会让系统陷入困境吗?” - 实际上不是很多(我的意思是主要是CPU时间)。如果您在循环中运行操作并且不会暂停,则会获得更多负载。您的系统将花费大量时间在上下文切换上开始您的任务,官员这是不可避免的开销,但如果您执行非常简单的任务,这个开销将与您的有用工作量相当。

“尝试使用这款超级快速计时器有什么危险吗?” - 正如您在上面写的“在毫秒是关键的地图中快速查找”时,您使用毫秒作为键,但是如果计数被破坏,则不会每毫秒运行一次。

    static int inc = 0;
    public static void main(String[] args) throws InterruptedException {


        TimerTask timerTask = new TimerTask() {
            public void run() {                
                inc++;
            }
        };

        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 1);        
        Thread.sleep(500000);
        timer.cancel();
        timer.purge();
        System.out.println(inc);
    }