Как подойти к очереди событий Java

Привет всем и спасибо за время, которое вы уделили заранее!

У меня проблема, я не знаю, как подойти к Java. Допустим, у меня есть пользовательский интерфейс, который создает события, которые должны быть «выполнены» в определенное время в будущем, которое может варьироваться от пары минут в будущем до нескольких дней.

Я хотел создать класс (скажем, EventHandler), который реализует Runnable, а затем ConcurrentLinkedList, в котором хранятся эти экземпляры, упорядоченные по времени их выполнения, от наименее заранее до наиболее заранее. После этого поток, который просматривает очередь, и если системное время превышает ожидаемое время выполнения, запускает процесс.

Проблема заключается в том, что помимо проблем параллелизма, связанных со списком, поток просмотра потребляет процессорное время. Поэтому мне было интересно, есть ли более элегантное решение, учитывая, что в интервале в одну секунду могут быть запланированы сотни событий. Кроме того, я использую Hibernate с MongoDb для хранения вещей, если это вообще влияет.

Спасибо!

Обновлено: я открыт для всех других решений, о которых вы можете подумать, если они решают «события очереди и выполняют их в установленное время»

Похоже, вы заново изобретаете DelayQueue.

kaqqao 16.03.2019 02:21

DelayQueue и сохраните отдельный объект с самым ранним временем истечения срока действия, чтобы не проводить опрос слишком часто.

edharned 16.03.2019 16:28

Спасибо. Не знал об этой очереди. Я пробовал с ним, и я думаю, что я доволен результатом. Надо будет проверить и поглубже подумать над реальной полной реализацией программы, и смогу ли я ее к этому приспособить. Спасибо!

Jorge Vázquez Acevedo 18.03.2019 15:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
709
1

Ответы 1

Прямой подход — использовать Запланированный поток пула исполнителей.

int corePoolSize = 1;// for sequential execution of tasks
// for parallel execution use Runtime.getRuntime().availableProcessors(); 

ScheduledThreadPoolExecutor executor = ScheduledThreadPoolExecutor(corePoolSize);
...
Runnable command1 = ...
executor.schedule(command1, 2, TimeUnit.MINUTES); // execute in couple of minutes
Runnable command2 = ...
executor.schedule(command2, 7, TimeUnit.DAYS); // execute in 7 days

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