Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建计时器循环最被动的方式是什么?_Java_Loops_Time - Fatal编程技术网

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

Java 创建计时器循环最被动的方式是什么?,java,loops,time,Java,Loops,Time,对于你们需要知道的人,我正在为CraftBukkit编写一个插件,它是Minecraft的一个修改版本,我是一个初级java程序员。我有一个我认为非常基本的问题 我正在尝试实现一个倒计时,它执行方法,每秒向玩家发送消息,持续20秒 显然,我不能简单地创建一个循环20秒的循环,因为该循环将冻结主线程直到完成,这是不可接受的。(有很多游戏代码正在执行) 有哪些方法可以创建被动运行或不停止主线程的循环 我唯一能想到的就是创建一个新线程来运行倒计时。 当然有更简单的方法来做到这一点吗 因此,您不会感到困

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

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

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

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

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

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


对不起,我说的不清楚或不明白

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

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

您尝试过吗

我建议您不要使用Swing for GUI/图形(不熟悉CraftBukkit,所以这将由您决定)。特别要注意的是,查看允许以固定间隔重复任务的
计划的形式


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

我认为javax.Swing.Timer正是我想要的。我正在阅读文档,但它基本上将要执行的代码添加到一个延迟中,允许主线程在延迟结束时继续运行。对吗?@cody是的,所有任务调度器都是这样做的。Swing Timer在EDT上执行任务,这一点非常具体。我强烈认为只有在实际构建Swing GUI时才应该使用
javax.Swing
类(这里几乎肯定不是这样)。您是否使用
Swing
?不,不使用Swing。util定时器更适合我的需要谢谢!然后您应该在
java.util.concurrent
包中使用非常可靠的API,它是
ScheduledExecutorService
。看看这个例子:
  int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          //...Perform a task...
      }
  };
  new Timer(delay, taskPerformer).start();