異なるスレッドがキュー(プロデューサー)にデータを入力し、1つのコンシューマーがこのキューから要素を取得する状況があります。私の問題は、これらの要素の1つがキューから取得されるときに、一部が欠落していることです(信号が欠落していますか?)。プロデューサーコードは次のとおりです。
class Producer implements Runnable {
    private Consumer consumer;
    Producer(Consumer consumer) { this.consumer = consumer; }
    @Override
public void run() {
    consumer.send("message");
  }
}
そして、それらは次のもので作成および実行されます。
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 20; i++) {
  executor.execute(new Producer(consumer));
}
消費者コードは次のとおりです。
class Consumer implements Runnable {
private Queue<String> queue = new ConcurrentLinkedQueue<String>();
void send(String message) {
    synchronized (queue) {
        queue.add(message);
        System.out.println("SIZE: " + queue.size());
        queue.notify();
    }
}
@Override
public void run() {
    int counter = 0;
    synchronized (queue) {
    while(true) {
        try {
            System.out.println("SLEEP");
                queue.wait(10);
        } catch (InterruptedException e) {
                Thread.interrupted();
        }
        System.out.println(counter);
        if (!queue.isEmpty()) {             
            queue.poll();
            counter++;
        }
    }
    }
}
}
コードを実行すると、20個の要素が追加され、20個が取得されることがありますが、それ以外の場合、取得される要素は20未満です。これを修正する方法はありますか?