Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否仅在当前时间内每秒执行一次代码?_Java_Algorithm - Fatal编程技术网

Java 是否仅在当前时间内每秒执行一次代码?

Java 是否仅在当前时间内每秒执行一次代码?,java,algorithm,Java,Algorithm,仅使用当前时间时,如何每秒执行代码?(没有额外的变量,它没有精确到每秒钟的时间,我很满意800到1200毫秒之间的变化) 我确实试过: //code repeated every 30-100ms if ((System.currentTimeMillis() % 1000) == 0) { //execute code 但是这不起作用,因为currentTimeMillis被1000整除的几率不是很高 在这个问题上有什么好主意吗 [编辑]请注意我的“无额外变量”备注。让我再解释一下: 我需要

仅使用当前时间时,如何每秒执行代码?(没有额外的变量,它没有精确到每秒钟的时间,我很满意800到1200毫秒之间的变化)

我确实试过:

//code repeated every 30-100ms
if ((System.currentTimeMillis() % 1000) == 0) { //execute code
但是这不起作用,因为currentTimeMillis被1000整除的几率不是很高

在这个问题上有什么好主意吗

[编辑]请注意我的“无额外变量”备注。让我再解释一下:
我需要把这段代码放在一个地方,在那里我只有一个长值,指示自1970年以来的unix时间(currentTimeMillis的值)。我什么都记不起来了,也不能保存额外的变量,以便下次执行代码时可以访问这些变量。这是一个特例。

这个if语句会按照您的要求执行(800毫秒到1200毫秒之间),但效率非常低,我以前的答案或其他一些答案会更好地满足您的要求

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

}
if((System.currentTimeMillis()%1000)<200 | |(System.currentTimeMillis()%1000)>800){
}
或者,由于您的代码大约每30-100毫秒重复一次,因此您可以使用

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

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

您可以使用java.util.Timer进行此操作,但如果不定义额外变量,则无法执行此计划操作,否则它将处于无限模式

您可以尝试以下方法:

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

你可以试着用它来获得秒数,然后用你想要的方式来使用它

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

这是每1秒做一件事

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

我能想到的唯一方法是检查我们是否在时间窗口内,执行操作,然后使用
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);
    }
}
私有静态最终长窗口=200;
void doitonceperssecond(长时间)抛出InterruptedException{
//查一下时间。
如果((时间%1000)/窗口==0){
//做好你的工作。
System.out.println(“现在!!”+时间+“-”+(时间%1000));
//在窗外等很久。
睡眠(窗口-(时间%1000));
}
}
public void test()引发InterruptedException{
System.out.println(“你好”);
长启动=System.currentTimeMillis();
长t;
而((t=System.currentTimeMillis())-start<10000){
多烯头孢秒(t);
睡眠(100);
}
}

除此之外,您可能还需要以其他方式保留一个值—可能需要自己使用一个套接字。

如我的问题中所述,“无额外变量;”@t我编辑了答案,以你想要的形式给你,但效率太低了,我还没有回复,因为我要先测试一下,但乍一看,它看起来很有希望。这种方法的危险在于,每秒一次的代码可能会在同一个窗口中执行多次。@ErickG.Hagstrom我同意,但这就是OP希望其他代码必须更频繁地运行的方式?或者
Thread.sleep(1000)
对于您的情况是否足够?“没有额外的变量”为什么不?还有哪些核心语言功能不能任意使用?我的解决方案对您有效还是有问题?@TinusTate
if((System.currentTimeMillis()%1000)==0){
编译为与
long currentTime=System.currentTimeMillis()相同的字节码;if(currentTime%1000==0){
“无额外变量”这并不意味着代码不存储东西;只是你没有明确的名称。我要冒险再猜一次:他写的任何东西都会被实例化,调用一次,然后被他的环境杀死。因此,尽管你是正确的,@AndyTurner,“额外变量”在下一次代码中不会出现。“没有额外的变量"正如我在问题中提到的;-)@TinusTate你需要一个解决方案,还是你只是想迷惑我们?如果是第二个,那么我不确定stackoverflow是一个正确的地方。同意AdamSkywalker。不确定没有额外变量意味着什么。ScheduledExecutorService是我在真实代码中执行此操作的方式。也许你有一个人为的问题,你没有o解决?在正常情况下发布的所有答案都是完全正确的,这一点毫无疑问。但我有一个有特殊要求的特殊案例。也许我在写问题时应该更加注意这一点。“没有额外的变量”正如我在问题中提到的;-)我在这里没有看到任何额外的变量,@TinusTate。有什么问题吗?“没有额外的变量”正如我在问题中提到的;-)
task
可以是包含要运行的代码的匿名内部类;不需要变量。
delay
可以是常量,例如1000。
period
是TimeUnit.SECONDS或类似的概念。没有额外的变量。如果文章作者试图在“If”中执行重复块声明,我想,我们帮不了他:)
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);
    }
}