在Java应用程序中以确定性的方式运行多线程应用程序是否可行?我的意思是在两次不同运行中始终具有相同的线程切换。
这样做的原因是为了在每次运行中以完全相同的条件运行模拟。
类似的情况是,当使用随机数生成器时,给定一些任意种子以获得始终相同的“随机”序列。
在Java应用程序中以确定性的方式运行多线程应用程序是否可行?我的意思是在两次不同运行中始终具有相同的线程切换。
这样做的原因是为了在每次运行中以完全相同的条件运行模拟。
类似的情况是,当使用随机数生成器时,给定一些任意种子以获得始终相同的“随机”序列。
我不知道有任何实用的方法来做到这一点。
理论上,在某些假设条件下,可以实现具有完全确定行为的字节码解释器1。您需要通过在软件中完全实现线程和线程调度,并使用单个本地线程来模拟多个线程。
1 - 例如,没有I/O和不使用系统时钟。
除非您自己模拟,否则不可能以相同的方式每次交替使用多个线程。线程不是为此而设计的。
如果您想要确定性结果,请不要使用线程。
正如OldCurmudgeon
所说,使用多线程是不可能的。
如果您决定使用单个Thread
,我建议使用newSingleThreadExecutor
而不是普通的Thread
,因为newSingleThreadExecutor
具有更高的灵活性和优势。
请使用Executors
中的newSingleThreadExecutor。
public static ExecutorService newSingleThreadExecutor()
相关SE问题:
Executors.newFixedThreadPool(1)和Executors.newSingleThreadExecutor()之间的区别