Как подойти к очереди событий Java - PullRequest
1 голос
/ 16 марта 2019

Привет всем и спасибо за потраченное время!

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

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

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

Спасибо!

РЕДАКТИРОВАТЬ: Я открыт для всех других решений, о которых вы можете подумать, при условии, что он решает "события очереди и выполняет их в то время, когда они установлены"

1 Ответ

0 голосов
/ 18 марта 2019

Простой подход заключается в использовании ScheduledThreadPoolExecutor .

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
...