Java 创建计时器循环最被动的方式是什么?
对于你们需要知道的人,我正在为CraftBukkit编写一个插件,它是Minecraft的一个修改版本,我是一个初级java程序员。我有一个我认为非常基本的问题 我正在尝试实现一个倒计时,它执行方法,每秒向玩家发送消息,持续20秒 显然,我不能简单地创建一个循环20秒的循环,因为该循环将冻结主线程直到完成,这是不可接受的。(有很多游戏代码正在执行) 有哪些方法可以创建被动运行或不停止主线程的循环 我唯一能想到的就是创建一个新线程来运行倒计时。 当然有更简单的方法来做到这一点吗 因此,您不会感到困惑,倒计时不是作为某些主循环的一部分初始化的,它是由用户命令侦听器线性初始化的,但它的代码在主循环中执行。我的意思是,我需要实际启动一个检查时间的循环,因为这段代码只执行一次Java 创建计时器循环最被动的方式是什么?,java,loops,time,Java,Loops,Time,对于你们需要知道的人,我正在为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();