运行一个多线程程序可以同步非常慢的Java

运行一个多线程程序可以同步非常慢的Java,java,multithreading,csv,conceptual,Java,Multithreading,Csv,Conceptual,这个问题有点复杂,但我会尽力把它简化 我有一个程序,我想运行多线程 这就是程序所做的: 初始化可执行文件(命令行实用程序) 将文件加载到可执行文件中(文件由数据提供程序方法提供) 根据加载的文件向该可执行文件发送命令 从可执行文件解析接收到的响应 将结果写入csv文件 所有这些都是通过一种方法实现的 但是,在多线程模式下运行时,一切正常,除了写入csv文件的所有结果都是错误的和无序的 但是,当我在方法声明中添加sychronized关键字并使用多个线程运行程序时,程序运行得很好 public s

这个问题有点复杂,但我会尽力把它简化

我有一个程序,我想运行多线程

这就是程序所做的:

  • 初始化可执行文件(命令行实用程序)
  • 将文件加载到可执行文件中(文件由数据提供程序方法提供)
  • 根据加载的文件向该可执行文件发送命令
  • 从可执行文件解析接收到的响应
  • 将结果写入csv文件
  • 所有这些都是通过一种方法实现的

    但是,在多线程模式下运行时,一切正常,除了写入csv文件的所有结果都是错误的和无序的

    但是,当我在方法声明中添加sychronized关键字并使用多个线程运行程序时,程序运行得很好

    public sychronized void run(Dataprovider data) {
        ...
    }
    
    但是,程序的运行速度与我在单线程模式下运行时的速度相同。我怎样才能解决这个问题?这让我快发疯了

    如何以多线程方式正确运行此程序

    我在寻找想法和/或指导

    编辑:

    但是,在多线程模式下运行时,一切都正常 除此之外,写入csv文件的所有结果都是错误的,并且不正确 秩序

    我在可执行文件中加载一个文件,对该文件运行一些计算,然后保存它。然后,我得到新生成的文件的字节大小(file.length)。我将新文件的结果与旧文件(加载的文件)进行比较,发现新文件比旧文件小(这是完全错误的)。新文件的文件大小始终为12263字节,这是不正确的

    编辑:

    以下是写入CSV文件的部分代码:

    编辑: 删除代码示例以简化

    但是,在多线程模式下运行时,一切都正常 除此之外,写入csv文件的所有结果都是错误的,并且不正确 秩序

    我可以大胆猜测你这句话是什么意思,但如果说得更具体一些,会有帮助的

    是因为来自不同线程的输出被混在同一行中,甚至是同一行中的同一个令牌,所以结果是错误的吗

    在csv文件中,记录通常由换行符分隔。您能否重构您的解决方案,以便线程在写入输出之前生成完整的行,并一次性将该行写入输出


    您的解决方案已经这样做了吗?(不清楚……问题中没有代码。)

    取决于“写入csv文件的所有结果都是错误和无序的”的含义。您如何在多线程模式下运行此功能?我希望在多线程模式下运行时,所有结果都是无序的——一旦多个线程运行,它们就不会以任何可预测的顺序执行。@JoeC一旦我在可执行文件中加载一个文件,我会对该文件运行一些计算,然后保存它。然后,我得到新生成的文件的字节大小(file.length)。我将新文件的结果与旧文件(加载的文件)进行比较,发现新文件比旧文件小(完全错误)。错误是什么意思?@melgart我有一个围绕该可执行文件构建的java包装器,它允许我通过java与可执行文件进行交互。在该包装器中,我引入了“enginepool”概念,它允许我建立一个可执行实例池,并为我加载的每个文件获得一个实例()。我运行这个程序的机器有8个内核,所以我有8个可执行文件的实例。所以我可以同时运行8个文件。我对我的问题进行了编辑,使之更加清晰。我宁愿不添加代码,因为它会使事情变得更复杂。csv文件的格式正确。但是,写入其中的数据不是。我查找我生成的文件的文件大小,大多数文件的文件大小始终为12263字节,这是不正确的。这是一个有趣的建议,一次写入输出…我可能需要研究一下。我认为我的问题是,我有多个文件结果同时写入一个文件,这可能会导致collison;但是我开始怀疑你有一些状态跟踪变量被多个线程写入(覆盖)。