如何在java中使用线程读写文件?

如何在java中使用线程读写文件?,java,multithreading,java-io,Java,Multithreading,Java Io,我正在编写一个应用程序,需要从单个文件中读取块,每个块大约是512字节。我还需要同时写块 我的想法之一是BlockReader实现Runnable和BlockWriter实现Runnable和BlockManager同时管理读写器 在我发现的大多数示例中,我看到的问题是锁定问题和潜在的死锁情况。如何实现这一点有什么想法吗?您可以拥有一个锁数组,例如32,并使用块的索引作为散列来确定要获取哪个锁。通过这种方式,您可以同时进行读/写操作(大部分时间),并且仍然可以确保不会在多个线程中读/写同一块。我

我正在编写一个应用程序,需要从单个文件中读取块,每个块大约是512字节。我还需要同时写块

我的想法之一是
BlockReader实现Runnable
BlockWriter实现Runnable
BlockManager
同时管理读写器


在我发现的大多数示例中,我看到的问题是锁定问题和潜在的死锁情况。如何实现这一点有什么想法吗?

您可以拥有一个锁数组,例如32,并使用块的索引作为散列来确定要获取哪个锁。通过这种方式,您可以同时进行读/写操作(大部分时间),并且仍然可以确保不会在多个线程中读/写同一块。

我推荐这本书,在本例中是第5.3节(生产者-消费者模式)

您的解决方案可能类似于:

BlockingQueue<Data> queue = 
    new  LinkedBlockingQueue<Data>(MAX_BLOCKS_IN_QUEUE_UNTIL_BLOCK );

for (int i=0; i < MAX_DATA_PRODUCERS; i++ ) {
   new Thread( new DataProducer( queue ) ).start();
}

new Thread(DataWriter( queue )).start

非顺序写入在任何情况下都会损害性能。我认为使用单个工作线程(写入)的阻塞队列解决方案将提供更好的性能和更少的麻烦…@extranon似乎应该是一个答案,而不是一个注释;)为了清楚起见-并发写入是一项要求,还是您只想在数据生成线程完成后转储其数据,以便它们可以处理不同的块?WarmAffles您指定并发写入,而我的解决方案不执行并发写入:(@extranon后者,加载程序显然会将块加载到内存中,用户会处理它,然后在完成后,BlockWriter会将块提交到一个文件,然后从内存中删除块。我毫不怀疑这会起作用,但我真的认为,同时编写一个包含搜索的单个文件并不是一个简单的过程我认为只有一个消费者的生产者-消费者模式会更好,但我想听听另一种意见。无论哪种方式,你都应该达到同样的性能。P-C模式可能是一种更好的设计选择。
 class DataProducer implements Runnable {
    ...
    queue.put(data); // blocks if MAX_BLOCKS_IN_QUEUE_UNTIL_BLOCK 
                     // are waiting to be written
                     // This prevents an OutOfMemoryException
    ...
 }

 class DataConsumer implements Runnable {
   ...
   try {
       while(true) {
           writeData(queue.take()); // blocks until there is a block of data
       }
   } catch (InteruptedException e) {
       Thread.currentThread().interrupt();
   }
   ...
 }