最終的にファイルに書き込む必要があるイベント処理スキームがあります。ファイルがフラッシュされているとき、つまり BufferedWriter.write(String) の最後まで待機しているときに、イベントを遅らせる余裕はありません。
それを達成する最も簡単な方法を探しています(それを行うライブラリはありますか?この問題を抱えていたのは私だけではないと思います)
最終的にファイルに書き込む必要があるイベント処理スキームがあります。ファイルがフラッシュされているとき、つまり BufferedWriter.write(String) の最後まで待機しているときに、イベントを遅らせる余裕はありません。
それを達成する最も簡単な方法を探しています(それを行うライブラリはありますか?この問題を抱えていたのは私だけではないと思います)
シングル スレッド エグゼキューターを使用して、各イベントのファイル書き込みを実行できます。
ExecutorService executor = Executors.newSingleThreadExecutor();
// for each event
executor.submit(new Runnable() {
public void run()
{
// write to the file here
}
});
スレッドは 1 つだけで、executor がキューイングを処理します。
基本的に、ファイルへの書き込みによってイベント処理の流れが中断されないようにする必要があります。
この場合、ファイル処理を別のスレッドに委譲するだけで済みます。
コードは次のようになります。
// 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
同じスレッドを保持している限り、データを保存するために使用でき、一致するファイルjava.io.PipedOutputStream
とは別のスレッドをコピーできます。PipedInputStream
イベントをキュー/リストに配置してから、イベントを書き込み、それらを書き出す別のスレッドを持つキューベースのシステムを作成できます。このようにして、ファイルライターはシステムの残りの部分に対して非同期になり、唯一の遅延はリストに要素を追加することになります.