Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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 如何通过多个线程编写CSV文件,而不会在线程之间发生任何中断?_Java_Csv - Fatal编程技术网

Java 如何通过多个线程编写CSV文件,而不会在线程之间发生任何中断?

Java 如何通过多个线程编写CSV文件,而不会在线程之间发生任何中断?,java,csv,Java,Csv,我注意到,当我试图通过多个线程同时编写CSV文件时,有一些数据丢失或数据合并。那么,如何避免丢失或错误的数据呢?我的建议是在线程外创建一个writer处理程序,并同步println/write方法,如下所示: package snippet; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.concurrent.ExecutorService; import java.util

我注意到,当我试图通过多个线程同时编写CSV文件时,有一些数据丢失或数据合并。那么,如何避免丢失或错误的数据呢?

我的建议是在线程外创建一个writer处理程序,并同步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);
    }
}

您应该实现整个并发保存。使用同步块或互斥机制。@HerrDerb是的,我同时保存它。我想它很可能不是完全并发安全的。否则你就不会有这些问题。也许一些代码可以帮助分析问题。