Java在X分钟内完成一些事情
我正在寻找一种每X分钟做一件事的方法 例如,在游戏中,您将每3分钟激活一次Java在X分钟内完成一些事情,java,Java,我正在寻找一种每X分钟做一件事的方法 例如,在游戏中,您将每3分钟激活一次 foo(); 但我不知道如何做到这一点,因为其他行动将继续进行。也就是说,我们不能只等待3分钟,然后执行foo(),相反,程序的其余部分必须在运行,用户可以调用其他方法,但在后台,我们必须计数并准备在时间准备好时执行foo() 如果有人能给我一个起点,我将不胜感激 在单独的线程中使用计时器 您需要某种方式的独立线程,其中包含计时器。内置结构是最重要的 可以找到关于如何使用的教程 本教程有点让人困惑和难看,因此这里总结
foo();
但我不知道如何做到这一点,因为其他行动将继续进行。也就是说,我们不能只等待3分钟,然后执行foo()
,相反,程序的其余部分必须在运行,用户可以调用其他方法,但在后台,我们必须计数并准备在时间准备好时执行foo()
如果有人能给我一个起点,我将不胜感激 在单独的线程中使用计时器
您需要某种方式的独立线程,其中包含计时器。内置结构是最重要的 可以找到关于如何使用的教程 本教程有点让人困惑和难看,因此这里总结为三个步骤: 1) 定义线程执行器(管理线程的东西) 2) 创建一个类,该类包含您希望在计划中执行的任何操作
public class RunnableClass implements Runnable {
public void run() {
// Do some logic here
}
}
3) 使用executor在您想要的程序的任何级别上运行Runnable类
Runnable someTask = new RunnableClass(); // From step 2 above
long timeDelay = 3; // You can specify 3 what
someScheduler.schedule(someTask , timeDelay, TimeUnit.MINUTES);
您可能想要使用线程。您可以将foo()函数放在一个线程中,使其每X分钟休眠并执行一次,然后将程序的其余部分放在其他线程中,以便其他函数可以继续执行。下面是一个关于如何在java中设置多线程程序的好教程:Bryan Davis指出了解决方案,但提供的链接不是很优雅。以下是一个简短的示例:
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);
对于单线程游戏,您只需检查每个循环是否到了执行
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;
}
什么类型的GUI库?摆动JavaFx?Android?相关的,可能是重复的:目前只是标准java。假设它是基于文本的,以简化操作?请参阅。基本上:使用调用
Thread.sleep(3000)的方法创建并启动一个新的Thread
;foo()循环中的代码>(3000以毫秒为单位)。但是,根据foo
所做的工作,您可能必须采取其他措施,以确保事情同步,并且您没有foo
,并且如果程序的其他部分修改了数据或其他内容,它们会相互干扰。如果您使用的是Swing,那么还需要先学习其他内容。请使用scheduleAtFixedRate()
:
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;
}