只用当前时间执行代码?

问题描述:

如何在只使用当前时间的情况下每秒执行一次代码? (没有多余的变量,它不具备正好每一秒,我很高兴有800到1200毫秒之间变化)只用当前时间执行代码?

我曾尝试:

//code repeated every 30-100ms 
if ((System.currentTimeMillis() % 1000) == 0) { //execute code 

但是这并未没有工作,导致currentTimeMillis可以精确地除以1000的可能性不是很高。

关于这个问题的任何明智的想法?

请注意我的“没有额外变量”的评论。让我更好地解释一下: 我需要把这段代码放在一个地方,我只有一个很长的值,表示1970年以来的unix时间(currentTimeMillis的值)。我不记得任何东西,我也不能保存下次执行代码时可以访问的额外变量。这是一个特例。

+0

是否有其他代码需要更频繁地运行?或者'Thread.sleep(1000)'足以满足您的情况? –

+4

“没有额外的变量”为什么不呢?还有哪些核心语言功能不能随意使用? –

+0

我的解决方案适用于您还是有问题? – Dan

此,如果按照您的要求(800毫秒和1200ms之间)语句会做,但它是非常低效的和我以前的答案,或者一些其他的答案会是在做你想要的东西好多了

if ((System.currentTimeMillis() % 1000) < 200 || (System.currentTimeMillis() % 1000) > 800) { 

} 

或者因为你的代码大致重复一次30-100毫秒,你可以使用

if ((System.currentTimeMillis() % 1000) < 100|| (System.currentTimeMillis() % 1000) > 900) { 

} 
+0

“没有额外的变量”,如我的问题所述;-) –

+0

好吧会编辑答案,对不起,我错过了那个 – Dan

+0

@TinusTate我编辑答案给你它的形式,但它是如此低效 – Dan

要做到这一点,最好的办法是使用ScheduledExecutorService

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
Future future = service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS); 

当你不再需要它,你可以取消执行

future.cancel(true); 
+0

“没有额外的变量”,如我的问题所述;-) –

+2

@TinusTate你需要一个解决方案,或者你只是想解惑我们吗?如果第二,那么我不知道这个*是一个正确的地方去做。 – AdamSkywalker

+0

同意AdamSkywalker。 – eg04lt3r

while(true) { 
    //execute your code here 
    Thread.sleep(1000); 
} 
+0

“没有额外的变量”,如我的问题所述;-) –

+4

我没有看到任何额外的变量,@TinusTate。有什么问题? –

+0

我都没有... :) – 2016-01-21 13:02:14

您可以使用java.util.Timer中的这一点,但你不能没有定义额外的变量,或者做预约操作将处于无限模式。

你可以试试这个:

new Timer().schedule(task, delay, period); 
+0

“没有额外的变量”,如我的问题所述;-) –

+0

'任务'可以是一个匿名的内部类包含要运行的代码;不需要变量。 “延迟”可以是一个常数,例如, 1000.'period'是TimeUnit.SECONDS或者其他一些想法。没有额外的变量。 –

+0

如果文章的作者试图在“if”语句中执行重复的块,我认为我们不能帮助他:) – eg04lt3r

你可以试试这个得到秒,使用它,你想的方式......

long timeMillis = System.currentTimeMillis(); 
long timeSeconds = TimeUnit.MILLISECONDS.toSeconds(timeMillis); 

此做一些事情每1秒

while (true) { 
    System.out.println("a second has passed"); 
    Thread.sleep(1000); 
} 

我能想到做到这一点的唯一方法是检查我们是否在时间窗口,执行操作和n使用Thread.sleep足够长,以确保我们超出时间窗口。

private static final long WINDOW = 200; 

void doItOncePerSecond(long time) throws InterruptedException { 
    // Check the time. 
    if ((time % 1000)/WINDOW == 0) { 
     // Do your work. 
     System.out.println("Now!! " + time + " - " + (time % 1000)); 
     // Wait long enopugh to be out of the window. 
     Thread.sleep(WINDOW - (time % 1000)); 
    } 
} 

public void test() throws InterruptedException { 
    System.out.println("Hello"); 
    long start = System.currentTimeMillis(); 
    long t; 
    while ((t = System.currentTimeMillis()) - start < 10000) { 
     doItOncePerSecond(t); 
     Thread.sleep(100); 
    } 
} 

除此之外,你可能需要以其他方式坚持一个值 - 也许使用套接字给自己。