java - 当一个线程访问一个方法时,如何防止其他线程访问该方法?

标签 java multithreading

我想在 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/

相关文章:

java - 如何在java中显示jList上的项目?

java - 坐标序列的线条绘制错误

java - 解码 Base64 字符串时出现奇怪的符号

c++ - main 在 pthread 之后不继续

c - 在 C 的不同线程中运行函数内的一组特定行

java - 在其迭代过滤器函数中调用 IntStream

java - 为什么应用或忽略 Chef 属性?

c++ - 多线程性能问题

java - 我无法完成线程(可运行),这是怎么回事?

multithreading - TPL : Background thread completion notification?