创建定时器循环的最被动方式是什么?

时间:2013-05-08 16:31:11

标签: java loops time

对于那些你需要知道的人,我正在为CraftBukkit编写一个插件,这是Minecraft的一个改编版本,而且我是一个初级java程序员。我认为这是一个非常基本的问题。

我正在尝试实施倒计时,执行方法每秒钟向玩家发送消息20秒。

显然,我不能简单地创建一个循环20秒的循环,因为该循环将冻结主线程直到它完成,这是不可接受的。 (有很多游戏代码在执行)

有哪些方法可以创建一个被动运行或不停止主线程的循环?

我唯一能想到的就是创建一个新的线程来运行倒计时。 当然有一种更简单的方法可以做到这一点吗?

所以你不会感到困惑,倒计时不会被初始化为某个主循环的一部分,它由用户命令监听器线性初始化,但其代码在主循环中执行。我的意思是我需要实际启动一个检查时间的循环,因为这段代码只执行一次。

很抱歉,如果我不清楚或有意义的话。

3 个答案:

答案 0 :(得分:1)

您可以使用java.util.concurrent.Executors.newSingleThreadScheduledExecutor()并以1秒的间隔方便地安排倒计时任务。

或者,如果您的任务必须在事件调度线程(“GUI线程”)上运行,javax.swing.Timer将为您提供更好的服务。

答案 1 :(得分:1)

如果你没有使用Swing for GUI / Graphics(不熟悉CraftBukkit,我会建议java.util.Timer,所以由你来决定)。特别是,查看允许以固定间隔重复任务的schedule形式。

javax.swing.Timer类似。最大的区别(除了用于响应定时器被触发的接口)是javax.swing.Timer利用EDT(事件调度线程)来运行事件。如果您使用的是Swing GUI,则此线程已经存在且正在运行,您希望使用它。如果您不使用Swing或AWT,那么这是您不需要的额外开销。

答案 2 :(得分:0)

你试过javax.swing.Timer吗?

  int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          //...Perform a task...
      }
  };
  new Timer(delay, taskPerformer).start();