В настоящее время я разрабатываю свое программное обеспечение Java, управляемое событиями, следующим образом (это суть моего основного метода):
while(true) {
Event event = eventListener.poll();
if(event != null) {
// do something
} else {
// do nothing as usual, but burn CPU time.
}
}
В зависимости от того, что я создаю, eventListener
может быть чем-то, что прослушивает внешний веб-сокет, опрашивает канал Redis на наличие обновлений или ожидает сообщения от другого процесса, сидящего в том же поле (возможно, через UDP/TCP/shm).
Я думаю, что этот подход с циклом занятости тратит впустую много времени процессора, когда eventListener
возвращает null (что происходит большую часть времени), поскольку он просто сидит и вращается. Однако я не знаю, как еще подойти к этому дизайну, кроме как ставить Thread.sleep
на каждой итерации, что не является отличным решением.
В идеале я хотел бы иметь метод:
void run(Event event) {
// do something
}
где run
вызывается каждый раз, когда событие достигает eventListener
. Если такое событие недоступно, процесс в идеале должен просто сидеть без дела.
Теперь я знаю, что есть библиотеки веб-сокетов, которые действительно могут это сделать, и я хочу знать, как я могу создать что-то подобное для себя и освободить свой процессор от того, чтобы сидеть там и ничего не делать?
poll
не нужно ждать. Например, еслиpoll
сводится кselect
обращениям к некоторым базовым файловым дескрипторам (сокетам, именованным каналам, ...), то вы тратите очень мало процессорного времени, потому что ядро знает, что нужно отправить ваш процесс в спящий режим, пока он ожидает события. . - person Joachim Sauer   schedule 10.10.2019poll
где-то сводится кInputStream.read()
, то это уже не ожидание занятости: ваш процесс не будет использовать значительное время ЦП, пока он ожидает поступления новых данных. Другие механизмы, такие как NIO/select, обеспечивают еще большую функциональность (например, одновременное чтение из нескольких сокетов и возврат, когда любой из них возвращает данные), но это не является строго необходимым. - person Joachim Sauer   schedule 10.10.2019