我們運行了AI
編程競賽,參賽者將使用我們提供的我們的API
代碼AI
運行在JVM
上。我們通過限制他們可以對SecurityManager
執行什麼操作來將它們放入沙箱中,並且在運行時他們只需設置幾個標誌,這些標誌是他們的決定。我們的系統和他們的AI
之間唯一的互動是通過這些標誌,所以如果他們的線程突然死亡,對我們沒有壞影響。如何殺死不可中斷的線程?
當AI
計算時間太長,我們想關閉他們的線程。但是,我們無法找到保證我們會銷燬他們的線索的方法。一個可能的原因是AI
進入無限循環,沒有阻塞,使得Thread.interrupt()
無用。 Thread.stop()
是不可靠的,因爲如果他們在try catch塊中,ThreadDeath
異常將被捕獲,並且對我們來說沒有問題,因爲他們沒有觸及任何不好的東西,我們也不在乎他們是否死亡。
目前我們只是忽略他們的線程,並在他們超時後沒有他們繼續,但他們的無限循環將繼續在後臺處理,直到JVM
死亡。這對我們來說是不可接受的,因爲我們將在Web服務器24/7上的後臺運行匹配項,所以我們希望獲得儘可能多的穩定性。一個想法是單獨運行每場比賽JVM
,但這比我們想要的要複雜得多。
是否有任何確定的消防方式來銷燬線程?
將代碼加載到您可以控制的線程中 – L7ColWinters 2012-02-02 19:38:23
請更清楚地解釋爲什麼'Thread.stop()'不是一個選項。 – Tudor 2012-02-02 20:02:51
根據你的API,你可以在一個單獨的進程中運行它們的代碼,並且如果它變得沒有響應就幹掉它。 – 2012-02-03 18:18:07