2013-05-08 50 views
1

對於那些你需要知道的,我正在爲CraftBukkit寫一個插件,它是Minecraft的一個修改版本,我是一個初級java程序員。我有我認爲是一個非常基本的問題。什麼是創建計時器循環的最被動方式?

我想實現一個倒計時,執行方法發送消息給玩家每秒鐘20秒。

顯然,我不能簡單地創建一個循環20秒,因爲該循環會凍結主線程,直到完成,這是不可接受的。 (有很多遊戲代碼正在執行)

有什麼方法可以創建一個循環,以便被動地運行或不停止主線程?

我唯一能想到的是創建一個新線程來運行倒計時。 當然,有一種更簡單的方法可以做到這一點?

所以你不會感到困惑,倒數並不是初始化爲主循環的一部分,它由用戶命令監聽器線性初始化,但其代碼在主循環中執行。我的意思是我需要實際啓動一個檢查時間的循環,因爲這個代碼只執行一次。

對不起,如果我不清楚或有意義。

+0

你在用'Swing'嗎? – 2013-05-08 16:51:12

+0

不,不使用Swing。該util計時器適合我的需要更好謝謝! – cody 2013-05-08 17:03:32

+0

然後你應該在'ScheduledExecutorService'的'java.util.concurrent'包中使用一個非常可靠的API。看看這個例子:http://stackoverflow.com/a/16445807/1981279 – 2013-05-08 17:13:16

回答

1

,如果你不使用的GUI /圖形鞦韆,我會建議java.util.Timer(不熟悉CraftBukkit,所以這將是由你來決定)。特別要看看schedule的形式,它們允許以固定的時間間隔重複任務。

javax.swing.Timer與此類似。最大的區別(除了用於響應定時器的接口被觸發)是javax.swing.Timer利用EDT(事件調度線程)來運行事件。如果您使用的是Swing GUI,則此線程已存在並正在運行,並且您想要使用它。如果你沒有使用Swing或AWT,那麼這是額外的開銷,你不需要。

1

您可以使用java.util.concurrent.Executors.newSingleThreadScheduledExecutor()並以1秒的間隔方便地安排倒計時任務。

或者,如果您的任務必須在事件調度線程(「GUI線程」)上運行,您最好通過javax.swing.Timer服務。

+0

我認爲javax.swing.Timer正是我正在尋找的。我正在閱讀文檔,但它基本上會將要執行的代碼添加到允許主線程繼續運行的延遲中,而延遲運行正確嗎? – cody 2013-05-08 16:37:36

+0

@cody是的,這就是所有任務調度程序所做的。擺動計時器具體是因爲它執行EDT上的任務。 – 2013-05-08 17:18:18

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(); 
+1

我強烈傾向於認爲只有在實際構建Swing GUI時(這幾乎肯定不是這種情況),才應該使用javax.swing類。 – 2013-05-08 16:38:20

相關問題