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