Java在X分钟内做了些什么

时间:2014-11-26 21:23:49

标签: java

我正在寻找一种每隔X分钟做一次事的方法。

例如,在游戏中,您将每隔3分钟播放

foo();

但我不确定如何做到这一点,因为其他行动将继续进行。即,我们不能等待3分钟,然后执行foo(),而程序的其余部分必须正在运行,用户可以调用其他方法,但在后台我们必须计算并做好准备foo()什么时候准备好了。

如果有人能给我一个起点,我会非常感激!

5 个答案:

答案 0 :(得分:7)

你想要某种单独的线程,其中包含一个计时器。内置结构是ScheduledExecutorService

可以找到here

的教程

这个教程有点令人困惑和丑陋,所以这里总结了三个步骤:

1)定义线程执行器(管理线程的东西)

int x = 1; // However many threads you want
ScheduledExecutorService someScheduler = Executors.newScheduledThreadPool(x); 

2)创建一个Runnable类,其中包含您希望按计划执行的任何操作。

public class RunnableClass implements Runnable {
   public void run() {
       // Do some logic here
   }
}

3)使用执行程序在您想要的任何级别的程序上运行Runnable类

Runnable someTask = new RunnableClass(); // From step 2 above
long timeDelay = 3; // You can specify 3 what
someScheduler.schedule(someTask , timeDelay, TimeUnit.MINUTES);

答案 1 :(得分:2)

答案 2 :(得分:1)

布莱恩戴维斯指出了解决方案,但提供的链接不是很优雅。这是一个简短的样本:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3); 
// 3 = number of thread in the thread pool

scheduler.scheduleAtFixedRate(new Runnable() 
{
       public void run() 
       { 
           // do something here
       }

}, 20, TimeUnit.SECONDS);

答案 3 :(得分:1)

对于单线程游戏,您可以检查每个循环是否是时候进行foo()。例如:

long lastTime;
long timeBetweenFoosInMillis = 3*60*1000; //3 minutes
public void loop(){
    while(true){
        doOtherGameStuff();
        if(isFooTime()){
            foo();
            lastTime = System.currentTimeMillis();
        }
    }
}
private boolean isFooTime(){
    return System.currentTimeMillis() >= lastTime + timeBetweenFoosInMillis;
}

答案 4 :(得分:0)

您可能想要使用Threads。您可以将foo()函数放在一个并使其休眠并每隔X分钟执行一次,并将其余程序放在其他线程中,以便其他函数可以继续执行。这是一个关于如何在java中设置多线程程序的好教程:http://www.oracle.com/technetwork/articles/java/fork-join-422606.html