我试图让一个计时器在我当前的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;
}
}
}
每个人对我的上一个问题都很有帮助,希望这个问题一样容易
答案 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);
答案 3 :(得分:0)
你所拥有的是相当低效的,因为它会浪费CPU周期等待下一个唤醒时间。如果我是你,我会使用Thread.sleep()
重写该函数。
至于为什么您当前的代码不起作用,您的for
循环条件已关闭,因此永远不会输入循环。
要让计时器代码与程序中的其他逻辑同时运行,您需要查看线程。
答案 4 :(得分:0)
听起来你可能想要研究多线程。如果你搜索SO,你会发现几个很好的问题/答案线程。网上其他地方也有教程......
答案 5 :(得分:0)
查看Timer或更好ScheduledExecutorService。它们使您能够定期执行某些操作并处理围绕该操作的计算。