每秒线程Java常量“滴答”

时间:2014-01-10 01:58:19

标签: java multithreading

我知道这对于更多经验丰富的程序员来说可能是完全明显的,但我找不到任何内容。

无论执行的任务有多长,我都需要制作一个每秒“滴答”一次的线程。显然不可能执行比每个刻度花费更长的任务,并且减慢每秒刻度的数量。

感谢。

3 个答案:

答案 0 :(得分:3)

使用java.util.Timer.scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task,
                       Date firstTime,
                       long period)
     

从指定时间开始,为重复的固定费率执行计划指定的任务。随后的执行大约定期进行,间隔指定的时间段。

     

在固定速率执行中,每次执行都是相对于初始执行的预定执行时间进行调度的。如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则会快速连续执行两次或更多次执行以“赶上”。从长远来看,执行频率将恰好是指定时间段的倒数(假设Object.wait(long)下的系统时钟是准确的)。由于上述原因,如果计划的第一次是在过去,那么任何“错过的”执行将被安排立即“追赶”执行。

     

固定费率执行适用于对绝对时间敏感的重复活动,例如每小时按小时响铃,或在特定时间每天运行定期维护。它也适用于重复活动,其中执行固定执行次数的总时间很重要,例如倒计时器,每秒钟滴答一次,持续十秒钟。最后,固定速率执行适用于安排必须保持彼此同步的多个重复计时器任务。

答案 1 :(得分:1)

这是Thread版本。如果您真的想要使用自己的线程,那么Timer将是可行的方法。

new Thread(new Runnable() {

    @Override
    public void run() {
        try {
        long before, sleepDuration, operationTime;
        for(int i=0;i<100;i++) {
            before = System.currentTimeMillis();
            // do your operations
            operationTime = (long)(1500*Math.random());
            System.out.print("Doing operations for "+operationTime+"ms\t");
            Thread.sleep(operationTime);

            // sleep for up to 1000ms
            sleepDuration = Math.min(1000, Math.max(1000 - (System.currentTimeMillis() - before), 0));
            Thread.sleep(sleepDuration);
            System.out.println("wait\t"+sleepDuration+"ms =\telapsed " + (operationTime+sleepDuration) + (operationTime > 1000 ? "<" : ""));
        }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}).start();

答案 2 :(得分:0)

TimerTimerTask类非常适合您使用。

查看文档http://docs.oracle.com/javase/6/docs/api/index.html?java/util/Timer.html或按照本课程http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html

如果我误解了你的问题,请告诉我。