2016-04-14 46 views
6

這是可能以確定性的方式運行多線程的Java應用程序?我的意思是在我的應用程序的兩個不同運行中總是有相同的線程切換。「無法重現」 - Java確定性多線程可能嗎?

原因是在每次運行中完全相同的條件下運行模擬。

類似的情況是,當使用隨機數發生器來獲得總是相同的「隨機」序列時,給出一些任意的種子。

+1

線程調度由操作系統,而不是Java的控制。 –

+0

如果您足夠仔細地同步了您的代碼,並且您只依靠可用的預先輸入,它應該始終顯示爲以相同的方式運行。 (或者說,如果結果取決於每次運行的具體時間,您就沒有足夠好地同步代碼)。根據您真正需要的內容,您還可以嘗試Java VM的實時實現。 – biziclop

+1

@biziclop,如果你的程序如此完全同步,很可能你至少失去了使用多線程的一些好處。 –

回答

4

我不知道有任何實際的方法來做到這一點。

從理論上講,在某些假設條件下,可以實現一個完全確定性行爲的字節碼解釋器。您需要通過完全在軟件中實現線程和線程調度並使用單個本地線程來模擬多個線程。


1 - 例如,沒有I/O,也沒有使用系統時鐘。

+0

您還可能必須實施GC。 – biziclop

+0

@biziclop - 也許不是。您需要擔心的唯一與GC相關的非確定性來源是基於內存地址的身份哈希碼和最終確定。我想,兩者都可以處理。 –

4

不,這是不可能的(除了自己模擬它)使用多個線程交錯在每次相同的方式。線程不是爲了做到這一點。

如果您需要確定性結果,請勿使用線程。

0

OldCurmudgeon所引用的,多線程無法實現。

如果你決定使用單Thread,我更喜歡newSingleThreadExecutor正常Thread由於

newSingleThreadExecutorExecutors

public static ExecutorService newSingleThreadExecutor() 

newSingleThreadExecutor

靈活性和優勢,用創建一個執行程序,它使用單個工作線程運行無限隊列。 (但是請注意,如果此單線程在關閉之前由於執行期間的故障而終止,那麼如果需要執行後續任務,則新線程將取代它的位置。)

任務保證按順序執行,且不超過一個任務在任何時候都將處於活動狀態。與其他等效的newFixedThreadPool(1)不同,保證返回的執行程序不會被重新配置爲使用其他線程。

相關SE問題:

Difference between Executors.newFixedThreadPool(1) and Executors.newSingleThreadExecutor()

ExecutorService vs Casual Thread Spawner