0

我试图让一个计时器在我当前的 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;
        }
    }
}

每个人都对我的最后一个问题很有帮助,希望这个问题同样简单

4

6 回答 6

2

我想你想要

Thread.sleep(500);

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

请参阅此处了解更多信息。

于 2012-11-20T16:01:14.977 回答
1

如果您需要在不同的线程中执行此操作,请查看Timer

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

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

于 2012-11-20T16:03:31.193 回答
1

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

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);

这种方法优于使用 Timer

于 2012-11-20T16:14:49.690 回答
0

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

于 2012-11-20T16:05:59.737 回答
0

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

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

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

于 2012-11-20T16:01:01.623 回答
0

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

于 2012-11-20T16:03:12.783 回答