Java 如何通过多个线程编写CSV文件,而不会在线程之间发生任何中断?
我注意到,当我试图通过多个线程同时编写CSV文件时,有一些数据丢失或数据合并。那么,如何避免丢失或错误的数据呢?我的建议是在线程外创建一个writer处理程序,并同步println/write方法,如下所示: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
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是的,我同时保存它。我想它很可能不是完全并发安全的。否则你就不会有这些问题。也许一些代码可以帮助分析问题。