使用同步器同步线程写入文件

ccrfmcuu  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(425)

我正在通过多个线程写入一个文件,因此我使用以下代码:

synchronized (this) {
                BufferedWriter bw = new BufferedWriter(
                        new FileWriter(path, true));
                bw.write(data);
            }

出于教育目的,我想知道如何使用一些同步器(信号量、倒计时锁存器、循环载波器、相位器或交换器)基本上实现相同的功能:安全的多线程写入。
谢谢

nafvub8i

nafvub8i1#

老实说,从多个源向同一个writer写入的更好的近乎重复的方法是使用(阻塞)队列。这样,所有线程都可以将其消息放到队列中,而writer线程可以从队列中提取消息并将其写入文件。它通常更容易实现,也更高效
--编辑--
例子:

public class MyQueueableWriter implements Runnable {
  private BlockingQueue<Msg> q = new BlockingQueue();
  private FileOutputStream fis = ...;
  private volatile boolean running = true;

  public MyQueueableWriter(FileOutputStream fis) {
    this.fis = fis;
  }

  public void run() {
    try {
      while (running) {
        Message m = q.take();
        fis.write(...);
      }
      fis.close();
    } catch (IOException iox) {
      ...
    }
  }

  public void addMsg(Msg m) {
    q.put(m);
  }

  public void stop() {
    running = false;
  }
}

然后添加到队列:

public class EnqueueMsgRunnable implements Runnable {
  MyQueueableWriter q = ...;
  q.put(myMessage);
  q.put(myMessage2);
}

那就

for (int i =0; i < numSources; i++) {
  EnqueueMsgRunnable r = new EnqueueMsgRunnable(...);
  new Thread(r).start();
}

相关问题