2011-10-20 10 views
2

私は1つのスレッドを持っています。これは、tcpパケットを受信し、各行をバッファに追加します。これはArrayList<String>です。 他のスレッドは、新しいデータが使用可能かどうかを定期的に確認する必要がありますが、バッファが現在ロックされていない場合に限ります。しかし、それがロックされているかどうかをどうやって確認するのですか? C++では、明示的にmutexをロックすることができます。Java:synchronized buffer

これは私が何をしたいのですがどのようないくつかの擬似コードです:

while(buffer.isLocked()) 
{ 
    buffer.wait(); 
} 

buffer.lock(); 
buffer.add(tcpPacket); 
buffer.unlock(); 
buffer.notify(); 

これは、これまでの私のJavaコードです:

void process(String tcpPacket) 
{ 

    synchronized(buffer) 
    { 
     buffer.add(tcpPacket); 
    } 
    buffer.notify(); 
} 

答えて

9

それは、標準の生産者 - 消費者問題です。 JDKはこれをシームレスに処理するためにArrayBlockingQueueを提供しています。

0

パイプを使用することもできますが、 (PipedInputStreamとPipedOutputStream)を使用して、ブロックIOメソッドを使用して、パケットが到着したときにスレッドが正しく起きるようにします。これは、「共有バッファ」問題に対するはるかに簡単なアプローチです。

+0

パイプがいっぱいになると、プロデューサがブロックされます。これらのパイプの流れは、価値があるよりはるかにトラブルです。 – EJP

+0

実際には、それが実際にIO操作の望ましい動作であるかどうかという疑問はありますか?つまり、コンシューマスレッドをオーバーランさせたくありません(コンシューマがプロデューサに追いつかない場合、無制限のキューは大量のメモリを消費します)。パイプがいっぱいになったときにプロデューサスレッドのIOをブロックすると、メモリ使用量が無期限に増加するのを防ぎ、バッファがいっぱいになったらコンシューマスレッドが優先されるようにすることができます。 – user268396

+0

私は個人的に1つのスレッドしか持たず、TCPに実際に送信者のブロックをさせます。私はこれらの2段階デザインの熱意を決して理解できません。読書プロセスは消費者であり、書込みプロセスは生産者である。それを複製する必要はありません。 – EJP

関連する問題