繁体   English   中英

如何使用Java中的线程读写文件?

[英]How do I read and write to a file using threads in java?

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

我的想法之一是BlockReader implements RunnableBlockWriter implements RunnableBlockManager管理读取器和写入器。

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

我会推荐《 实践中的Java并发 》一书,在本例中为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

显然,DataProducer和DataWriter是可运行的。

 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();
   }
   ...
 }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM