2

1 つのファイルからブロックを読み取る必要があるアプリケーションを作成しています。各ブロックは約 512 バイトです。ブロックを同時に書き込む必要もあります。

私が持っていたアイデアの 1 つは、リーダーとライターの両方を管理することでしBlockReader implements RunnableBlockWriter implements RunnableBlockManager

私が見つけたほとんどの例で見られる問題は、ロックの問題と潜在的なデッドロック状況でした。これを実装する方法はありますか?

4

2 に答える 2

6

本Java Concurrency in Practice、この場合はセクション 5.3 (Producer-consumer pattern)をお勧めします。

ソリューションは次のようになります。

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();
   }
   ...
 }
于 2011-01-15T19:46:12.413 に答える
1

たとえば 32 個のロックの配列を持ち、ブロックのインデックスをハッシュとして使用して、どのロックを取得するかを決定できます。このようにして、(ほとんどの場合)同時読み取り/書き込みを行うことができ、複数のスレッドで同じブロックを読み取り/書き込みしないようにすることができます。

于 2011-01-15T19:36:06.957 に答える