2009-12-11 84 views
1

我正在用Java编写应用程序,但需要知道如何每秒从变量中减去一次。最简单的方法是什么?谢谢!以Java中的常量间隔递减

+1

我想要的“元问题”是实际要求是什么。自特定时间点以来的秒数很容易在没有后台线程的情况下进行计算,然后可将其转换为startValue - numberOfSeconds的实时计算。如果你的计时器由于某种原因不能启动,你不会失去减量。 – PSpeed 2009-12-11 18:00:58

+0

这个问题需要一个计时器。 – 2009-12-11 19:07:15

回答

6

做重复操作的名称the very Java class you need to use已经坐在你的标签之一! ;)

+4

这是多么有趣,但粗鲁。我会查找它。 – 2009-12-11 17:57:32

+0

对不起,没有粗鲁的意图!只是试图保持它的松散。 – 2009-12-11 18:09:28

+1

+1。我会以同样的方式回应。 – BalusC 2009-12-11 18:13:13

0

使用java.util.Timer创建TimerTask。

2
class YourTimer extends TimerTask 
{ 
    public volatile int sharedVar = INITIAL_VALUE; 

    public void run() 
    { 
    --sharedVar; 
    } 

    public static void main(String[] args) 
    { 
    Timer timer = new Timer(); 

    timer.schedule(new YourTimer(), 0, 1000); 
    // second parameter is initial delay, third is period of execution in msec 
    } 
} 

Remeber是Timer类是不能保证实时(如几乎所有的在Java中..)

+0

您需要使sharedVar变为volatile,因为计时器与读取它的程序在不同的线程中运行。 – 2009-12-11 18:02:40

+0

没有人正在阅读它。然而,从原理上来说,它是正确的..它应该是volatile的,否则它可以被线程缓存(失去同步) – Jack 2009-12-11 18:06:18

+0

使用'scheduleAtFixedRate()'而不是'schedule()'来克服“不实时“问题。 – BalusC 2009-12-11 18:09:26

5

虽然Timer类将工作,我建议使用ScheduledExecutorService代替。

虽然它们的用法非常相似,但是ScheduledExecutorService更新,更有可能接受持续维护,可以很好地与其他并发实用程序配合使用,并且可能会提供更好的性能。

+0

很高兴了解有关ScheduledExecutorService的+1。然而,我会要求看到证据表明这个人会比其他人更好地维护。 – 2009-12-11 19:49:10

2

你想达到什么目的?我不会尝试依靠定时器每秒钟恰好触发一次。我只需记录开始时间,并在计时器触发时重新计算变量的值应该是多少。下面是我该怎么做...

class CountdownValue { 
    private long startTime; 
    private int startVal; 

    public CountdownValue(int startVal) 
    { 
    startTime = System.currentTimeMillis(); 
    } 

    public int getValue() 
    { 
    return startVal - (int)((System.currentTimeMillis() - startTime)/1000); 
    } 
} 
+1

没有'getCurrentTimeMillis()'这样的方法。无论如何,如果你想重新创建'java.util.Timer',而是使用'nanoTime()'而不是'currentTimeMillis()',因为它具有更好的准确性。 – BalusC 2009-12-11 18:14:59

+0

我不想重新发明计时器。我试图让一些能够在重负载系统上更加可靠地工作的东西(例如,当定时器正在等待时间片时,你不会有不正确的数值,只有百分之几秒)。 – Yuliy 2009-12-11 19:15:01

+0

此外,getCurrentTimeMillis错字很好。固定的。 – Yuliy 2009-12-11 19:15:32