Реализовать планировщик весной

Проект требует следующего сценария:

class A имеет некоторые объекты (динамически созданные), которые он генерирует вместе с time interval связан с каждым объектом. Этому классу нужен сгенерированный объект после этого time interval только. Мне нужно реализовать механизм, который обеспечивает класс объектами после того, как он связан time interval, Иногда может также потребоваться конкретный объект до того, как time interval истекает.

Вот что я сделал:

  • Посмотрел ConcurrentTaskExecutor и org.springframework.scheduling.concurrent, но не нашел его полезным, потому что я не хочу, чтобы тысячи потоков выполнялись для каждого объекта. Кроме того, я не хочу повторять конкретную работу через определенный промежуток времени.

  • Я создал Thread B который берет весь объект в очередь, имеет бесконечный цикл, который постоянно проверяет все объекты time interval с текущим временем, и возвращает, если это time interval не истек.

    while (true) {
        timerObject = queue.take();
        if (timerObject.getEndTime() < System.currentTimeMillis()) {
           //Do something
            } else {
           queue.put(timerObject);
            }
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    

Это не очень эффективная реализация. С ним связана логическая ошибка. Когда объектов очень мало (например, 1 или 2), объекты не находятся в очереди, и всякий раз, когда я пытаюсь удалить объект из очереди, отображается unsuccessful, потому что цикл while имеет объект все время. И поэтому я должен был поставить sleep чтобы избежать этого. Я не хочу проверять каждый time interval когда размер очереди увеличивается до 10K или около того.

Есть ли простой и эффективный способ достижения решения. Любая помощь приветствуется.

1 ответ

Решение

Вы можете использовать ConcurrentTaskScheduler или реализовать что-то подобное с помощью DelayQueue. Вы можете использовать его с платформой Spring Concurrent (например, создание подкласса ThreadPoolExecutorFactoryBean) или с основными исполнителями Java.

Другие вопросы по тегам