Откладывание BufferedWriter.write в другой поток - PullRequest
3 голосов
/ 06 мая 2009

У меня есть схема обработки событий, которая также должна в конечном итоге записываться в файл; Я не могу позволить отложить событие, когда файл сбрасывается, то есть ждать до конца BufferedWriter.write (String).

Я ищу самый простой способ достичь этого (есть ли библиотека, которая делает это? Я считаю, что я не единственный, у кого была эта проблема)

Ответы [ 4 ]

5 голосов
/ 06 мая 2009

Вы можете использовать однопоточный исполнитель для выполнения записи файла для каждого события.

ExecutorService executor = Executors.newSingleThreadExecutor();

// for each event
executor.submit(new Runnable() {
  public void run()
  {
     // write to the file here
  }
});

Будет только один поток, и исполнитель позаботится об очередях.

2 голосов
/ 06 мая 2009

По сути, вы хотите, чтобы запись в файл не прерывала ваш поток обработки событий.

В этом случае все, что вам нужно сделать, это делегировать обработку файла в отдельный поток.

Ваш код должен выглядеть примерно так:

// event handling starts

Runnable fileHandlingThread = new Runnable() {
    public void run() {
        // open the file
        // write to the file
        // flush the file
    }
};

new Thread(fileHandlingThread).start();

// continue doing other things in the mean time
1 голос
/ 06 мая 2009

Пока вы сохраняете один и тот же поток, вы можете использовать java.io.PipedOutputStream для хранения данных и иметь отдельную копию потока из соответствующего PipedInputStream в файл.

0 голосов
/ 06 мая 2009

Вы можете создать систему на основе очередей, в которой вы помещаете события в очередь / список, а затем создаете другой поток, который принимает записываемые события и записывает их. Таким образом, средство записи файлов будет асинхронно с остальной системой, и ваша единственная задержка будет добавлением элемента в список.

...