我正在寻找一种每隔X分钟做一次事的方法。
例如,在游戏中,您将每隔3分钟播放
foo();
但我不确定如何做到这一点,因为其他行动将继续进行。即,我们不能等待3分钟,然后执行foo()
,而程序的其余部分必须正在运行,用户可以调用其他方法,但在后台我们必须计算并做好准备foo()
什么时候准备好了。
如果有人能给我一个起点,我会非常感激!
答案 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)
在单独的线程中使用计时器!
https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
答案 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