我正在编写一个应用程序,我需要从单个文件读取块,每个块大约512字节。我还需要同时编写块。
我的一个想法是BlockReader implements Runnable
,BlockWriter implements Runnable
和BlockManager
管理读者和作者。
我发现的大多数示例中遇到的问题是锁定问题和潜在的死锁情况。任何想法如何实现这个?
答案 0 :(得分:4)
我会推荐这本书java Concurrency in Practice,本例中为第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();
}
...
}
答案 1 :(得分:1)
你可以拥有一系列锁,例如32并使用块的索引作为哈希来确定要获取的锁。这样,您可以进行并发读/写(大多数情况下),并且仍然可以确保您不会在多个线程中读/写同一个块。