"无法复制" - Java确定性多线程可能吗?

时间:2016-04-14 15:00:40

标签: java multithreading deterministic

这是否可以以确定的方式运行多线程Java应用程序?我的意思是在我的应用程序的两个不同运行中始终使用相同的线程切换。

原因是在每次运行中以完全相同的条件运行模拟。

类似的情况是,当使用随机数生成器获得总是相同的随机数时,一个人给出一些任意种子"序列

3 个答案:

答案 0 :(得分:4)

我不知道有任何实际可行的方法。

理论上,在某些假设 1 下,可以实现具有完全确定性行为的字节码解释器。您需要通过完全在软件中并使用单个本机线程实现线程和线程调度来模拟多个线程。

1 - 例如,没有I / O,也没有使用系统时钟。

答案 1 :(得分:4)

不可能(除了自己模拟之外)每次都以相同的方式使用多个线程交错。线程不是为此而设计的。

如果您想要确定性结果,请不要使用线程。

答案 2 :(得分:0)

OldCurmudgeon引用,多线程无法实现。

如果您决定使用单Thread,由于newSingleThreadExecutor

的灵活性和优势,我更喜欢Thread正常newSingleThreadExecutor

使用

来自Executors

newSingleThreadExecutor

public static ExecutorService newSingleThreadExecutor()
  

创建一个Executor,它使用一个在无界队列中运行的工作线程。 (但请注意,如果此单个线程由于在关闭之前执行期间的故障而终止,则在需要执行后续任务时将使用新的线程。)

     

保证任务按顺序执行,并且在任何给定时间不会有多个任务处于活动状态。与其他等效的newFixedThreadPool(1)不同,保证返回的执行程序不可重新配置以使用其他线程。

相关的SE问题:

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

ExecutorService vs Casual Thread Spawner