Очередь в многопоточке

Задача:

  1. Реализовать Колцентр
  2. Поток-колцентра после запуска начинает генерировать несколько “звонков”
  3. Потоки-операторы берут доступные звонки в работу

Проблема: оператор начинает сразу обрабатывать запрос. Хочу (но не знаю как), чтобы операторы не ждали, пока сгенерится общий пул заявок и сразу начали обработку заявки после первой заявки. Помогите, пожалуйста.

public class Main {

    public static void main(String[] args) throws InterruptedException {

        CallCenter callCenter = new CallCenter();

        Thread atc = new Thread(callCenter::workATC, "АТС");

        Thread profy1 = new Thread(callCenter::workOperator, "Operator 1");

        Thread profy2 = new Thread(callCenter::workOperator, "Operator 2");

        Thread profy3 = new Thread(callCenter::workOperator, "Operator 3");



        profy1.start();
        Thread.sleep(1000);
        profy2.start();
        Thread.sleep(1000);
        profy3.start();
        atc.start();
        atc.join();
        profy1.join();
        profy2.join();
        profy2.join();

    }
}
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class CallCenter {

    public Queue<String> queue = new ConcurrentLinkedQueue<>();

    int iterations = 0;

    public void workATC() {
        try {
            for (int i = 1; i <= (12); i++) {
                String call = "request " + i;
                queue.add(call);
                System.out.printf("%s added to queue ATC %s\n", Thread.currentThread().getName(), call);
            }
            iterations++;
            Thread.sleep(3350);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void workOperator() {
        try {
            Thread.sleep(3000);
            while (true) {
                if (queue.isEmpty()) {
                    break;
                } else {
                        System.out.printf("%s has worked with %s\n", Thread.currentThread().getName(), queue.poll());
                        System.out.printf("%d requests has left \n", queue.size());
                    Thread.sleep(3000);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


Они ж не ждут, просто он мгновенно заполняется.
Видимо это должно было быть внутри цикла

Ну и еще тут чего-то операторы сразу уходят домой когда в очереди нет звонков.

1 лайк

Спасибо