2016-11-13 131 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

再次 - 我看不到代碼;但我開始懷疑你有一些狀態跟蹤變量正在被多個線程寫入(覆蓋)。 –