Привет всем и спасибо за время, которое вы уделили заранее!
У меня проблема, я не знаю, как подойти к Java. Допустим, у меня есть пользовательский интерфейс, который создает события, которые должны быть «выполнены» в определенное время в будущем, которое может варьироваться от пары минут в будущем до нескольких дней.
Я хотел создать класс (скажем, EventHandler), который реализует Runnable, а затем ConcurrentLinkedList, в котором хранятся эти экземпляры, упорядоченные по времени их выполнения, от наименее заранее до наиболее заранее. После этого поток, который просматривает очередь, и если системное время превышает ожидаемое время выполнения, запускает процесс.
Проблема заключается в том, что помимо проблем параллелизма, связанных со списком, поток просмотра потребляет процессорное время. Поэтому мне было интересно, есть ли более элегантное решение, учитывая, что в интервале в одну секунду могут быть запланированы сотни событий. Кроме того, я использую Hibernate с MongoDb для хранения вещей, если это вообще влияет.
Спасибо!
Обновлено: я открыт для всех других решений, о которых вы можете подумать, если они решают «события очереди и выполняют их в установленное время»
DelayQueue и сохраните отдельный объект с самым ранним временем истечения срока действия, чтобы не проводить опрос слишком часто.
Спасибо. Не знал об этой очереди. Я пробовал с ним, и я думаю, что я доволен результатом. Надо будет проверить и поглубже подумать над реальной полной реализацией программы, и смогу ли я ее к этому приспособить. Спасибо!




Прямой подход — использовать Запланированный поток пула исполнителей.
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
Похоже, вы заново изобретаете
DelayQueue.