【问题标题】:Deferring BufferedWriter.write to another thread将 BufferedWriter.write 推迟到另一个线程
【发布时间】:2009-05-06 08:24:05
【问题描述】:

我有一个事件处理方案,它最终也应该写入文件;我不能在文件被刷新时延迟事件,即等待 BufferedWriter.write(String) 结束。

我正在寻找实现这一目标的最简单方法(有图书馆这样做吗?我认为我不是唯一遇到此问题的人)

【问题讨论】:

    标签: java multithreading file bufferedwriter


    【解决方案1】:

    您可以使用单线程执行器为每个事件执行文件写入。

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

    只有一个线程,执行器会负责排队。

    【讨论】:

      【解决方案2】:

      基本上,您希望写入文件不会中断您的事件处理流程。

      在这种情况下,您只需将文件处理委托给单独的线程即可。

      您的代码应如下所示:

      // 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
      

      【讨论】:

      • 我有很多事件即将发生 - 有时每秒超过 25 万。我不认为为每个事件创建一个线程会很有效。
      【解决方案3】:

      只要您保持相同的线程,您就可以使用java.io.PipedOutputStream 来存储数据,并将匹配的PipedInputStream 中的单独线程复制到文件中。

      【讨论】:

        【解决方案4】:

        您可以创建一个基于队列的系统,在其中将事件放在队列/列表中,然后有另一个线程将要写入的事件写入并写出。这样,文件编写器将与系统的其余部分异步,您唯一的延迟就是将元素添加到列表中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          • 1970-01-01
          • 2020-06-09
          • 2019-09-16
          相关资源
          最近更新 更多