Я на самом деле пытаюсь написать цикл событий для Nashorn (java 8), так что обратные вызовы от асинхронных операций (потоки, которые я запускаю, например, для подключения к удаленным службам или выполнения длительных вычислений) помещаться в очередь и выполняться последовательно (не параллельно). Я делаю это, помещая функции обратного вызова в ConcurrentLinkedQueue и используя ScheduledExecutorService в качестве цикла, который проверяет очередь на выполнение обратного вызова.Цикл событий в java
работает нормально, но мои вопросы:
1) как короткий интервал можно использовать без перетаскивания моего процессора? Я буду иметь несколько из них, и они должны быть независимыми друг от друга. Таким образом, может существовать 50 потоков, которые запускают собственный цикл событий. Этот исполнитель пытается выполнить свой готовый к выполнению каждого 10мс, например ....
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(<cbRunnable>, 0, 10, TimeUnit.MILLISECONDS);
2) Есть ли такой подход преимущества над:
while (true) {
// check queue and execute any callback...
}
3) Есть ли лучший способ?
«не перетаскивая мой процессор» Можете ли вы объяснить, что именно это означает для вас? – ControlAltDel
Как насчет использования блокирующей очереди вместо опроса? – RealSkeptic
@ControlAltDel: Я имею в виду, что слишком много не нужно платить за процессор. Использование всех его циклов и т. Д. –