我想在 10 个文件中搜索一个字符串,并将匹配的行写入一个文件中。我将每个文件中的匹配行写入 10 个输出文件(o/p file1、o/p file2...),然后使用 10 个线程将它们复制到单个文件。
但是输出单个文件具有混合输出(来自o/p文件1的一行,来自o/p文件2的另一行等...),因为它被许多线程同时访问。如果我等待所有线程完成然后写入单个文件,速度会慢得多。 我希望输出文件一次由一个线程写入。我该怎么办?
我的源代码:(仅写入单个文件方法)
public void WriteSingle(File output_file,File final_output) throws IOException {
synchronized(output_file){
System.out.println("Writing Single file");
FileOutputStream fo = new FileOutputStream(final_output,true);
FileChannel fi = fo.getChannel();
FileInputStream fs = new FileInputStream(output_file);
FileChannel fc = fs.getChannel();
int maxCount = (64 * 1024 * 1024) - (32 * 1024);
long size = fc.size();
long position = 0;
while (position < size) {
position += fc.transferTo(position, maxCount, fi);
}
}
}
最佳答案
public synchronized void method() {
}
并确保在存在该方法之前flush()
/close()
所有流。
并且,正如 Xavier 的评论中所述,请确保您在同一实例上调用该方法。因为同步是针对每个实例进行的(在本例中)
关于java - 当一个线程访问一个方法时,如何防止其他线程访问该方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2866526/