2012-08-24 52 views
1

我正在製作一個編程遊戲,玩家可以在其中編寫盟友的行爲。玩家爲給定的盟友編寫判定()函數的主體,可以用任何java代碼填寫,但必須返回一個動作。我想給每個盟友一個限制的計算量,因此1)添加更多的實體並不會太慢,2)實體花在計算上的時間反映在遊戲中,所以如果一個盟友花更多的時間「思考」它的行爲會少一些。我的靈感應該是如何工作的,它是每回合給出單位一定數量的字節碼,然後暫停計算,讓程序員在事情發生變化時處理注意事項。暫停/恢復線程中的任意計算

我的問題是我如何可以暫停和恢復執行線程中的決策功能的實體。我理解這種做法的「正確」方法是設置一個標誌,告訴線程暫停並偶爾檢查它,但由於我無法強制播放器在decision()函數中檢查標誌,因此我不知道如何暫停線程。實體只查看世界的固定表示,只需返回一個枚舉值,所以我不認爲他們應該鎖定任何東西,但我希望有一個更好的方法來做到這一點,而不是使用已廢棄的線程暫停方法。我願意改變玩家編寫代碼的方式,但是我仍然想辦法做到這一點,同時仍然隱藏用戶的暫停標誌檢查,而沒有將決策循環寫入混亂和繁瑣。必須有一些方法可以做到這一點,因爲Battlecode可以做到這一點,但我在網上搜索有關如何進行細節的詳細信息。

+0

無論你決定,不要使用'Thread.pause'。 – Jeffrey

回答

0

如果你想'暫停'當前線程,java.util.concurrent.locks.LockSupport可能會幫助你。如果你想暫停其他線程,我認爲它不在java設計的範圍內,你只能中斷另一個線程,或者設置一個標誌,而不是暫停。

0

你不能「暫停一個線程」,並且你不能期望玩家遵守你的請求來「玩好」並檢查標誌等。你可以中斷另一個線程,但是線程中運行的代碼可以很容易地從此恢復。所以,你需要一種讓控制線程保持控制的方法。

不要去擔心什麼線程正在做的,你可以:

  • 給玩家線程返回操作的最大時間,如果他們不及時歸還,執行「默認操作」
  • 保持他們花了多少時間計算,並呼籲他們創紀錄的往往是他們用更少的時間等

大多數這類擔憂被java.util.concurrent庫照顧。退房:

+0

謝謝,我想我會在併發庫中使用類似的東西,但有什麼方法可以在超時後「保存」計算狀態嗎?我需要一種方法來獲得一個單一的決策循環,將其計算分佈在多個滴答點上,而不會爲編寫其決策程序的人造成太大的麻煩。在處理TimeoutException之前是否有某種方法可以給出線程最終指示? – Wikk