1

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

我正在尝试实现一个倒计时,该倒计时执行每秒向玩家发送消息的方法,持续 20 秒。

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

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

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

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

对不起,如果我不清楚或没有意义。

4

3 回答 3

1

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

或者,如果您的任务必须在事件调度线程(“GUI 线程”)上运行,那么javax.swing.Timer.

于 2013-05-08T16:33:33.490 回答
1

java.util.Timer如果您不使用 Swing 进行 GUI/图形(不熟悉 CraftBukkit,这将由您决定),我会建议您。特别是,查看schedule允许以固定间隔重复任务的形式。

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

于 2013-05-08T16:51:06.680 回答
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();
于 2013-05-08T16:35:57.220 回答