“无法重现” – Java确定性multithreading是否可能?

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

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

类似的情况是当使用随机数发生器获得总是相同的“随机”序列时,给出一些任意种子。

我不知道有任何实际的方法可以做到这一点。

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


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

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

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

正如OldCurmudgeon所引用的OldCurmudgeon ,multithreading无法实现。

如果您决定使用单个Thread ,由于newSingleThreadExecutor灵活性和优势,我更喜欢newSingleThreadExecutor到普通的Thread

使用

来自Executors newSingleThreadExecutor

 public static ExecutorService newSingleThreadExecutor() 

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

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

相关的SE问题:

Executors.newFixedThreadPool(1)和Executors.newSingleThreadExecutor()之间的区别

ExecutorService与Casual Thread Spawner