私は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();
}
パイプがいっぱいになると、プロデューサがブロックされます。これらのパイプの流れは、価値があるよりはるかにトラブルです。 – EJP
実際には、それが実際にIO操作の望ましい動作であるかどうかという疑問はありますか?つまり、コンシューマスレッドをオーバーランさせたくありません(コンシューマがプロデューサに追いつかない場合、無制限のキューは大量のメモリを消費します)。パイプがいっぱいになったときにプロデューサスレッドのIOをブロックすると、メモリ使用量が無期限に増加するのを防ぎ、バッファがいっぱいになったらコンシューマスレッドが優先されるようにすることができます。 – user268396
私は個人的に1つのスレッドしか持たず、TCPに実際に送信者のブロックをさせます。私はこれらの2段階デザインの熱意を決して理解できません。読書プロセスは消費者であり、書込みプロセスは生産者である。それを複製する必要はありません。 – EJP