2013-05-17 125 views
1

我正在做一個Java多玩家的回合制遊戲,我想限制每個球員必須使他們的行動的時候,遊戲是由遊戲會話或房間,每個房間有4個玩家。 這場比賽有大約40場比賽,每場比賽至少有160轉。遊戲服務器翻轉計時器

首先我看着java.util.Timer,然後我發現了,這似乎更好的ScheduledExecutorService,我可以爲每個遊戲會話的SingleThreadScheduledExecutor,創建一個新的可運行的每一個轉彎,如果玩家作是行動前可運行的是執行我可以調用ScheduledFuture.cancel()方法。

在理論上似乎不錯,但我有一些顧慮,所以我想知道:

  • 這是正確的做法?或者有更好的選擇?

  • 我能不能對所有遊戲會話爲每個遊戲會話ScheduledThreadPool代替 一個SingleThreadScheduledExecutor

  • 我注意到,取消ScheduledFuture將保持在 內存中,直到他的執行時間,可這是一個問題的 內存使用情況?

  • 最後,是否可以重複使用相同的runnable(每個遊戲 會話爲1),而不是每次都創建一個新的遊戲。

回答

0

A ScheduledExecutorService是一個很好的開始。只要記住要正確地同步你的遊戲狀態。

它一般是合法的回收一個可運行的,但是這可能不是這裏最好的選擇。

除非匝數打算是巨大的,取消任務的開銷是不值得的。相反,請在您的可運行信息中包含何時輪換什麼遊戲。當任務執行時,檢查遊戲狀態以查看是否仍然是當前回合,如果回合數已經移動,則不執行任何操作。

這避免了cancel()完成,任務執行,當移動提交接近最後期限,會發生之間的競爭條件。

+0

圈數將以每小時左右30.000。讓任務執行,只檢查遊戲狀態接近更簡單的解決方案,但是在記憶方面,你認爲取消ScheduledFuture會更好嗎? – Rias

+0

每個對象都將低於20個字節。所以如果最後期限是一個小時的話,那核心功能只有~60萬,這沒什麼。如果截止日期是一天,那還不到15megs,這還不足以擔憂。如果截止日期更長,您可能希望將截止日期保存到磁盤,並定期掃描它們,並且只安排那些不久的將來。 –