这是否可以以确定性方式运行多线程Java应用程序?我的意思是在我的应用程序的两个不同运行中始终切换相同的线程。
原因是在每次运行中都要在完全相同的条件下运行模拟。
类似的情况是,当使用随机数生成器获得始终相同的“随机”序列时,给出一些任意种子。
正如OldCurmudgeon
所引用的,多线程是不可能的。
如果您决定使用单线程
,我更喜欢newSingleThreadExecutor
而不是普通线程
,因为newSingleThreadExecutor
使用
从执行器
public static ExecutorService newSingleThreadExecutor()
创建一个执行器,该执行器使用在无界队列上运行的单个工作线程。(但是请注意,如果此单线程在关机之前的执行过程中由于故障而终止,则在需要执行后续任务时,将使用新线程代替它。)
任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。与其他等效的newFixedThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程。
相关SE问题:
Executors.newFixedThreadpool(1)和Executors.newSingleThreadExec的区别()
ExecutorService vs休闲线程Spawner
不,不可能每次都以相同的方式使用多个线程交错(自己模拟除外)。线程的设计不是为了实现这一点。
如果您想要确定的结果,不要使用线程。
我不知道有什么切实可行的方法来做到这一点。
理论上,在某些假设下,实现具有完全确定性行为的字节码解释器是可能的。您需要通过完全在软件中实现线程和线程调度并使用单个本机线程来模拟多个线程。
1-例如,没有I/O,也没有使用系统时钟。
问题内容: 是否可以确定性地运行多线程Java应用程序?我的意思是在应用程序的两次不同运行中始终具有相同的线程切换。 原因是在每次运行中都在完全相同的条件下运行模拟。 类似的情况是,当使用随机数生成器获得始终相同的“随机”序列时,给出任意种子。 问题答案: 我不知道有任何实际的方法可以做到这一点。 从理论上讲,在某些假设下1可以实现具有完全确定性行为的字节码解释器。您将需要通过完全在软件中实现线程
我正在学习Java的易失性,我的代码是这样的。 我知道如果flag没有volatile,线程就不会存在。这是能见度的问题。 但是,如果我在while循环中编写一些代码,如,t1线程将读取新值并停止循环。 我知道如何使用volatile来解决可见性问题,所以我的问题是: 为什么当我写?
问题内容: 最近,我完成了一个项目,该项目比以前需要更多的IO交互,我觉得我想超越常规库(尤其是Common IO),并解决一些更深入的IO问题。 作为一项学术测试,我决定实现一个基本的多线程HTTP下载程序。这个想法很简单:提供要下载的URL,然后代码将下载文件。为了提高下载速度,将文件分块,并同时下载每个块(使用HTTP 标头)以使用尽可能多的带宽。 我有一个可以正常工作的原型,但是正如您可能
问题内容: 所以基本上我创建了这个程序,为redis添加了值。到目前为止,我得到了这个时机: 但是,当我尝试运行多个线程时: 我用set ot得到这个: 为什么我的程序在有 更多 线程的情况下运行 速度较慢 ? __ 我正在运行Linux Ubuntu 11.04和Python 2.7.1。 问题答案: 结果取决于Python的实现,cpython的GIL阻止了并行计算比顺序计算更快。 考虑使用该
问题内容: 当我阅读“ 实践中的Java并发性 ” c03时,我对以下程序感到困惑: 由于重新排序和线程可见性,循环可能永远不会停止,或者输出可能为零,但是我已经尝试了很多次,并且输出始终为42。所有原因是我太幸运了吗? 问题答案: 所有的原因是我太幸运了吗? 不必要。这也将取决于您的处理器体系结构和JVM实现。那就是微妙的内存模型问题的问题之一:它们很难在野外复制。
问题内容: 为了在Linux上开发高度网络密集型服务器应用程序,首选哪种架构?这个想法是,该应用通常可以在具有多个内核(虚拟或物理)的机器上运行。考虑到性能是关键标准,选择多线程应用程序还是采用多进程设计更好?我确实知道资源共享和从多个进程访问此类资源的同步是很多编程开销,但是如前所述,整体性能是关键要求,因此我们可以忽略这些事情。编程语言为C / C ++。 我听说,即使是多线程应用程序(单个进