(Java)添加到计数器变量的Ticker

时间:2012-11-20 15:58:14

标签: java counter ticker

我试图让一个计时器在我当前的java项目中工作,它在一个无限循环内每隔n微秒(例如500秒,每秒1/2)将一个整数变量加1,这样它就会一直运行程序运行。 这是我目前的代码:

public class Ticker
{
    public int time = 0;
    long t0, t1;

    public void tick(int[] args)
    {
        for (int i = 2; i < 1; i++)
        {
            t0 = System.currentTimeMillis();
            do
            {
                t1 = System.currentTimeMillis();
            }
            while (t1 - t0 < 500);
            time = time + 1;
        }
    }
}

每个人对我的上一个问题都很有帮助,希望这个问题一样容易

6 个答案:

答案 0 :(得分:2)

我想你想要

Thread.sleep(500);

目前您正在消耗等待500毫秒的CPU周期(您提到的是微秒,但我相信您需要几毫秒)。上面说明你的当前线程休眠500毫秒,你的进程不会消耗任何CPU(至少是最小的 - 垃圾收集仍将运行)。如果你在运行版本时观察CPU,你应该看到差异。

有关详细信息,请参阅here

答案 1 :(得分:1)

如果您需要在其他主题中执行此操作,请查看Timer

int delay = 500; //milliseconds
ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        time++
    }
};
new Timer(delay, taskPerformer).start();

请注意,上面的代码不能使用局部变量(它们必须声明为final才能在匿名类中访问它们)。然而,它可以是一个成员。

答案 2 :(得分:1)

这是一个类似的ScheduledExecutorService示例,它将以500毫秒的间隔更新time变量:

ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);

exec.scheduleAtFixedRate(new Runnable(){
    private int time = 0;

    @Override
    public void run(){
        time++;
        System.out.println("Time: " + time);
    }
}, 0, 500, TimeUnit.MILLISECONDS);

This approach is preferred over using Timer

答案 3 :(得分:0)

你所拥有的是相当低效的,因为它会浪费CPU周期等待下一个唤醒时间。如果我是你,我会使用Thread.sleep()重写该函数。

至于为什么您当前的代码不起作用,您的for循环条件已关闭,因此永远不会输入循环。

要让计时器代码与程序中的其他逻辑同时运行,您需要查看线程。

答案 4 :(得分:0)

听起来你可能想要研究多线程。如果你搜索SO,你会发现几个很好的问题/答案线程。网上其他地方也有教程......

答案 5 :(得分:0)

查看Timer或更好ScheduledExecutorService。它们使您能够定期执行某些操作并处理围绕该操作的计算。