2016-11-13 57 views
-1

这个问题有点复杂,但我会尽我所能使它简单。运行一个多线程程序同步非常慢Java

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

这是该程序的功能:

  1. 初始化可执行(命令行实用程序)(文件从数据提供方法提供)
  2. 将命令发送到该
  3. 载荷文件到可执行在此基础上被加载
  4. 文件可执行解析从可执行
  5. 写入结果csv文件所接收的响应

所有这些都以单一方法进行。

但是,在多线程模式下运行时,一切运行正常,除非写入csv文件的所有结果都是错误的并且不按顺序。

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

public sychronized void run(Dataprovider data) { 
    ... 
} 

然而该方案以相同的速度运行,就好像我是在单线程模式下运行。我怎样才能解决这个问题?这使我疯狂......

如何正确运行此程序多线程?

我正在寻找的想法和/或指导

编辑:

然而,在多线程模式下运行时,一切都正常运行 除,全部写入到CSV文件中的结果错误并且出于 的顺序。

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

编辑:

这里是部分代码确实写入到CSV文件:

编辑: 删除为了简化代码示例

+1

取决于“所有写入csv文件的结果是错误的和乱序”的意思。 –

+0

你怎么在多线程模式下运行这个?我期望在多线程模式下运行时,所有结果都无序 - 一旦多个线程正在运行,它们不会以任何可预测的顺序执行。 –

+0

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

回答

1

然而在多线程模式下运行时,一切都正常运行 除外,所有的结果写入csv文件是错误的,并且出于 的顺序。

我可以猜测你的意思是什么,但如果它更具体一些,它会有所帮助。

结果是错误的,因为来自不同线程的输出混合在同一行甚至同一行中的同一个标记中?

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

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

+0

我已编辑我的问题更清晰。我宁愿不添加代码,因为它会让事情复杂化。 csv文件的格式是正确的。但写入它的数据不是。我查找生成的文件的文件大小,对于大多数文件,文件大小始终为12263字节,这是不正确的。 –

+0

这是一个有趣的建议,一次写完所有输出......我可能不得不考虑这一点。我认为我遇到的问题是我将多个文件结果同时写入单个文件,这可能导致并发。 –

+0

再次 - 我看不到代码;但我开始怀疑你有一些状态跟踪变量正在被多个线程写入(覆盖)。 –