Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟线程和数据写入线程并行性_Java_Multithreading_Simulation - Fatal编程技术网

Java 模拟线程和数据写入线程并行性

Java 模拟线程和数据写入线程并行性,java,multithreading,simulation,Java,Multithreading,Simulation,这是一个一般的编程问题。假设我有一个线程在做一个特定的模拟,速度非常重要。在每次迭代中,我都希望从中提取数据并将其写入文件 将数据移交给不同的线程并让模拟线程专注于自己的工作是更好的做法,还是因为速度非常重要,所以让模拟线程也进行数据记录而不复制数据。(在我的例子中是3-5个整数,大小为1000-10000) 首先,它肯定取决于我们复制了多少数据,但它还能依赖什么呢?同步和复制的成本值得吗?在每次迭代时创建小的可运行文件以处理每秒50次或更多迭代的记录任务,这是一种好的做法吗?如果您确实希望此状

这是一个一般的编程问题。假设我有一个线程在做一个特定的模拟,速度非常重要。在每次迭代中,我都希望从中提取数据并将其写入文件

将数据移交给不同的线程并让模拟线程专注于自己的工作是更好的做法,还是因为速度非常重要,所以让模拟线程也进行数据记录而不复制数据。(在我的例子中是3-5个整数,大小为1000-10000)


首先,它肯定取决于我们复制了多少数据,但它还能依赖什么呢?同步和复制的成本值得吗?在每次迭代时创建小的可运行文件以处理每秒50次或更多迭代的记录任务,这是一种好的做法吗?

如果您确实希望此状态捕获具有较低的延迟,并且希望在模拟过程中使用此延迟,则会想到两种技术。它们可以一起非常有效地使用。请注意,这两种方法与标准的Java践踏路径相去甚远,因此在滥用它们之前,请先测量并确认您需要这些技术;它们可能很难正确实施

  • 在模拟过程中将数据写入文件而不会减慢模拟速度的最快方法是将工作交给另一个线程。但是,必须注意切换是如何发生的,因为模拟线程中的内存屏障会减慢模拟。考虑到作者只关心值最终会出现,我会考虑使用AtomicLong.lazySet后面的内存屏障,它要求线程安全地写入到内存地址,而不阻止写入到另一个线程上可见。不幸的是,目前只能通过lazySet或sun.misc.Unsafe类直接访问此内存屏障,这显然不是公共Java API的一部分。然而,这不应该是一个太大的障碍,因为它在所有当前的JVM实现上都是如此,Doug Lea正在谈论将它的一部分转移到主流中

  • 避免Java使用的缓慢、阻塞的文件IO;使用内存映射文件。这让操作系统代表您执行异步IO,而且非常高效。它还支持使用上述相同的内存屏障


  • 对于这两种技术的示例,我强烈建议阅读Peter Lawrey的HFT编年史源代码。事实上,HFT编年史可能正是供您在此使用的图书馆。它提供了一个高效且易于使用的磁盘备份队列,每秒可支持一百万条左右的消息

    如果您真的希望在这个状态捕获上有低延迟,并且希望在模拟过程中有低延迟,那么您会想到两种技术。它们可以一起非常有效地使用。请注意,这两种方法与标准的Java践踏路径相去甚远,因此在滥用它们之前,请先测量并确认您需要这些技术;它们可能很难正确实施

  • 在模拟过程中将数据写入文件而不会减慢模拟速度的最快方法是将工作交给另一个线程。但是,必须注意切换是如何发生的,因为模拟线程中的内存屏障会减慢模拟。考虑到作者只关心值最终会出现,我会考虑使用AtomicLong.lazySet后面的内存屏障,它要求线程安全地写入到内存地址,而不阻止写入到另一个线程上可见。不幸的是,目前只能通过lazySet或sun.misc.Unsafe类直接访问此内存屏障,这显然不是公共Java API的一部分。然而,这不应该是一个太大的障碍,因为它在所有当前的JVM实现上都是如此,Doug Lea正在谈论将它的一部分转移到主流中

  • 避免Java使用的缓慢、阻塞的文件IO;使用内存映射文件。这让操作系统代表您执行异步IO,而且非常高效。它还支持使用上述相同的内存屏障

  • 对于这两种技术的示例,我强烈建议阅读Peter Lawrey的HFT编年史源代码。事实上,HFT编年史可能正是供您在此使用的图书馆。它提供了一个高效且易于使用的磁盘备份队列,每秒可支持一百万条左右的消息

    在a上的工作中,我将统计数据存储到一个数组中,当该数组准备好发送到GUI时,我将为tester客户端创建一个新数组,并将整个数组交给网络层。这意味着您不需要为任何复制付费,只需分配一个新的数组(JVM上的一个超快操作,涉及手工编码的汇编宏以利用任务可用的最佳SIMD指令)

    我还建议你不要直接投入到最佳记忆屏障使用的领域;普通
    volatile
    写操作和
    原子引用.lazySet()
    之间的差异只有在线程除了执行内存屏障(每秒至少有数百万次写操作)之外几乎什么都不做的情况下才能测量。根据您的目标I/O吞吐量,您甚至可能不需要NIO来实现这一目标。最好先尝试使用简单、易于维护的代码,而不是在没有确认需要的情况下深入研究高度专业化的API。

    在我对a的工作中,我将统计数据存储到一个数组中,当数组准备发送到GUI时,我会为测试人员客户端创建一个新数组,并将整个数组交给网络层。这意味着您不需要为任何复制付费,只需要分配一个新的数组(JVM上的一个超快操作,涉及手工编码的汇编宏以利用最佳的性能)