2017-08-28 11 views
0

CSVファイルを複数のスレッドで同時に書き込もうとしているときに、データが欠落しているかデータがマージされていることに気付きました。だから私はこの欠けているか間違ったデータを避けることができますか?CSVファイルをスレッド間で中断することなく複数のスレッドで書き込む方法は?

+0

[保存全部の並行処理を実装する必要があります。 'synchronized'ブロックまたは' mutex'メカニズムを使用してください。 –

+0

@HerrDerbはい、私はそれを同時に保存します。 –

+2

まあ、おそらく完全に安全な並行性はないと思います。さもなければ、それらの問題はありません。たぶん、いくつかのコードが問題の分析に役立つでしょう。 –

答えて

1

私の提案は、このように、printlnの/ writeメソッドをライターハンドラ外のスレッドを作成して同期することです:

package snippet; 

import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

public class MultiThreadWriter implements Runnable { 
    private SyncWriter sw; 

    public MultiThreadWriter(SyncWriter sw) { 
     this.sw = sw; 
    } 

    public void run() { 
     // ... 
     sw.println("whatever"); 
     // .... 
    } 

    public static void main(String[] args) { 
     SyncWriter writer = null; 
     try { 
      writer = new SyncWriter("foo.csv"); 
      ExecutorService pool = Executors.newFixedThreadPool(10); 
      pool.submit(new MultiThreadWriter(writer)); 
      pool.submit(new MultiThreadWriter(writer)); 
      pool.submit(new MultiThreadWriter(writer)); 
      pool.submit(new MultiThreadWriter(writer)); 
      pool.submit(new MultiThreadWriter(writer)); 
      pool.submit(new MultiThreadWriter(writer)); 
      pool.submit(new MultiThreadWriter(writer)); 
      pool.shutdown(); 
      while (pool.awaitTermination(1000, TimeUnit.MILLISECONDS)) { 
       ; 
      } 
      writer.close(); 
     } catch (Exception e) { 
      // .. 
     } 
    } 
} 

class SyncWriter { 
    private PrintWriter pw; 

    public SyncWriter(String path) throws FileNotFoundException { 
     pw = new PrintWriter(path); 
    } 

    public void close() { 
     pw.close(); 
    } 

    public synchronized void println(String x) { 
     pw.println(x); 
    } 
} 
関連する問題