Java:异步并发写入磁盘

标签 java multithreading java.util.concurrent

我的主线程中有一个函数,它将一些数据写入磁盘。我不希望我的主线程被卡住(磁盘 I/O 的高延迟)并且创建一个新线程只是为了写入是一种矫枉过正。我决定使用ExecutorService

ExecutorService executorService = Executors.newFixedThreadPool(3);

   Future future = executorService.submit(new Callable<Boolean>() {
    public Boolean call() throws Exception {
      logger.log(Level.INFO, "Writing data to disk");
      return writeToDisk();
    }
  });

writeToDisk是将写入磁盘的函数

这是一个好方法吗?有人可以引用更好的方法吗?

更新:数据大小将大于 100 MB。磁盘带宽为 40 MBps,因此写入操作可能需要几秒钟。我不希望调用函数被卡住,因为它必须执行其他工作,因此,我正在寻找一种方法来调度磁盘 I/O 与调用线程的执行异步。

我需要委派任务并忘记它!

最佳答案

无论如何,你的代码看起来都不错AsynchronousFileChannel来自新的非阻塞 IO。该实现使用 MappedByteBuffer通过FileChannel 。它可能会给你@Chris 所说的性能。下面是一个简单的例子:

public static void main(String[] args) {
    String filePath = "D:\\tmp\\async_file_write.txt";
    Path file = Paths.get(filePath);
    try(AsynchronousFileChannel asyncFile = AsynchronousFileChannel.open(file,
                        StandardOpenOption.WRITE,
                        StandardOpenOption.CREATE)) {

        asyncFile.write(ByteBuffer.wrap("Some text to be written".getBytes()), 0);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关于Java:异步并发写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26903853/

相关文章:

java - 通过管道将输入输入到 Bash 中的 Java 程序

java - Android - 防止启动时出现白屏

java - 获取定时任务的结果

java - 为什么Java中的BlockingQueue在notify上没有if子句?

Java 在执行相同操作的线程上使用等待/通知方法

java - 为什么 Java 并发处理不能处理新实例化的对象,而可以处理同一类的反序列化对象?

java - 使用 Java 或 .NET 库对 ColdFusion 中的 PDF 执行光学字符识别?

java - 获取打印到 JPanel 中的 TextArea 的方法

java - 将应用程序连接到 postgres 数据库

java - 具有多个线程的Java中的对象指针