【问题标题】:Java do something in X minutesJava 在 X 分钟内做某事
【发布时间】:2014-11-26 21:23:49
【问题描述】:

我正在寻找一种每 X 分钟执行一次操作的方法。

例如,在你将要玩的游戏中,每 3 分钟激活一次

foo();

但我不确定如何执行此操作,因为还会有其他操作。即,我们不能只等待 3 分钟然后执行foo(),而是程序的其余部分必须正在运行并且用户可以调用其他方法,但是在后台我们必须计数并准备在时间到时执行foo()准备好了。

如果有人能给我一个起点,我将不胜感激!

【问题讨论】:

  • 什么类型的 GUI 库?摇摆? JavaFX?安卓?
  • 现在只是标准的java。只是为了简单起见,它是基于文本的?
  • this tutorial。基本上:使用在循环中调用Thread.sleep(3000); foo(); 的方法创建并启动一个新的Thread(3000 以毫秒为单位)。但是根据 foo 所做的事情,您可能必须采取其他措施来确保事情是同步的,并且您没有 foo 并且您的程序的其余部分在修改数据或其他内容时会相互干扰。如果您使用的是 Swing,那么您还需要先学习其他内容。
  • 使用scheduleAtFixedRate():tutorialspoint.com/java/util/…

标签: java


【解决方案1】:

您想要某种方式的独立线程,其中包含一个计时器。内置结构是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);

【讨论】:

    【解决方案2】:
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      对于单线程游戏,您可以检查每个循环是否该执行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;
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-15
          • 1970-01-01
          • 2016-11-28
          • 2021-05-19
          • 1970-01-01
          相关资源
          最近更新 更多