Java在X分钟内完成一些事情

Java在X分钟内完成一些事情,java,Java,我正在寻找一种每X分钟做一件事的方法 例如,在游戏中,您将每3分钟激活一次 foo(); 但我不知道如何做到这一点,因为其他行动将继续进行。也就是说,我们不能只等待3分钟,然后执行foo(),相反,程序的其余部分必须在运行,用户可以调用其他方法,但在后台,我们必须计数并准备在时间准备好时执行foo() 如果有人能给我一个起点,我将不胜感激 在单独的线程中使用计时器 您需要某种方式的独立线程,其中包含计时器。内置结构是最重要的 可以找到关于如何使用的教程 本教程有点让人困惑和难看,因此这里总结

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

例如,在游戏中,您将每3分钟激活一次

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