只用当前时间执行代码?
如何在只使用当前时间的情况下每秒执行一次代码? (没有多余的变量,它不具备正好每一秒,我很高兴有800到1200毫秒之间变化)只用当前时间执行代码?
我曾尝试:
//code repeated every 30-100ms
if ((System.currentTimeMillis() % 1000) == 0) { //execute code
但是这并未没有工作,导致currentTimeMillis可以精确地除以1000的可能性不是很高。
关于这个问题的任何明智的想法?
请注意我的“没有额外变量”的评论。让我更好地解释一下: 我需要把这段代码放在一个地方,我只有一个很长的值,表示1970年以来的unix时间(currentTimeMillis的值)。我不记得任何东西,我也不能保存下次执行代码时可以访问的额外变量。这是一个特例。
此,如果按照您的要求(800毫秒和1200ms之间)语句会做,但它是非常低效的和我以前的答案,或者一些其他的答案会是在做你想要的东西好多了
if ((System.currentTimeMillis() % 1000) < 200 || (System.currentTimeMillis() % 1000) > 800) {
}
或者因为你的代码大致重复一次30-100毫秒,你可以使用
if ((System.currentTimeMillis() % 1000) < 100|| (System.currentTimeMillis() % 1000) > 900) {
}
要做到这一点,最好的办法是使用ScheduledExecutorService
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
Future future = service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
当你不再需要它,你可以取消执行
future.cancel(true);
“没有额外的变量”,如我的问题所述;-) –
@TinusTate你需要一个解决方案,或者你只是想解惑我们吗?如果第二,那么我不知道这个stackoverflow是一个正确的地方去做。 – AdamSkywalker
同意AdamSkywalker。 – eg04lt3r
while(true) {
//execute your code here
Thread.sleep(1000);
}
“没有额外的变量”,如我的问题所述;-) –
我没有看到任何额外的变量,@TinusTate。有什么问题? –
我都没有... :) – 2016-01-21 13:02:14
您可以使用java.util.Timer中的这一点,但你不能没有定义额外的变量,或者做预约操作将处于无限模式。
你可以试试这个:
new Timer().schedule(task, delay, period);
“没有额外的变量”,如我的问题所述;-) –
'任务'可以是一个匿名的内部类包含要运行的代码;不需要变量。 “延迟”可以是一个常数,例如, 1000.'period'是TimeUnit.SECONDS或者其他一些想法。没有额外的变量。 –
如果文章的作者试图在“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);
}
}
除此之外,你可能需要以其他方式坚持一个值 - 也许使用套接字给自己。
是否有其他代码需要更频繁地运行?或者'Thread.sleep(1000)'足以满足您的情况? –
“没有额外的变量”为什么不呢?还有哪些核心语言功能不能随意使用? –
我的解决方案适用于您还是有问题? – Dan