Реализовать планировщик весной
Проект требует следующего сценария:
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.