私は次のコードを書きましたが、どこかで間違っていると感じています。
public class ProcessQueue {
static BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
public ProcessQueue() {
process();
}
public void add(String message) throws InterruptedException {
System.out.println("Added Queue size:" + queue.size());
System.out.println("Locked by Producer");
queue.put(message);
System.out.println("Lock Released by Producer");
}
public static void process() {
new Thread() {
@Override
public void run() {
try {
while (true) {
System.out.println("Locked by Consumer");
Message.send(queue.take());
System.out.println("Locked Released by Consumer");
System.out.println("Consuming Queue size:" + queue.size());
}
} catch (Exception ex) {
System.out.print(ex.getMessage());
}
}
}.start();
}
}
ここで、add(String)は文字列をキューに追加します。UDPポートから入力を受信するたびに呼び出されます。process()はキューを処理し、処理のためにメッセージクラスに送信します。出力されたロックおよび解放された印刷ステートメントが目的の順序ではありません。
編集
私の予想される答えは次のようになります。プロデューサーに追加された場合は、プロデューサーによってロックされます->キューに追加->リリースをロックします。同じように消費者にもなります。ただし、操作はインターリーブしないでください。つまり、プロデューサーによってロックされたものが印刷されると、コンシューマーによってロックされた状態で印刷されてからロックが解除されないようにする必要があります。