Как я могу читать и писать в файл, используя потоки в Java? - PullRequest
2 голосов
/ 15 января 2011

Я пишу приложение, в котором мне нужно прочитать блоки из одного файла, каждый блок занимает примерно 512 байт.Мне также нужно писать блоки одновременно.

Одна из идей, которые у меня были: BlockReader implements Runnable, BlockWriter implements Runnable и BlockManager, управляет как читателем, так и писателем.я вижу с большинством примеров, которые я нашел, было проблемы с блокировкой и потенциальные тупиковые ситуации.Есть идеи, как это реализовать?

Ответы [ 2 ]

4 голосов
/ 15 января 2011

Я бы порекомендовал книгу Java-параллелизм на практике , в данном случае - раздел 5.3 (Шаблон производитель-потребитель).

Ваше решение может выглядеть примерно так:

Очевидно, что 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();
   }
   ...
 }
1 голос
/ 15 января 2011

Вы можете иметь массив блокировок, например, 32, и использовать индекс блока в качестве хэша, чтобы определить, какую блокировку получить.Таким образом, вы можете осуществлять одновременное чтение / запись (большую часть времени) и при этом гарантировать, что вы не будете читать / записывать один и тот же блок в нескольких потоках.

...