Помогите Бесконечные циклы, или блокирующие операции?

Абсик

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Abcik
У меня возникла необходимость получить данные из BungeeCord на сервере spigot. При этом не просто получить, а и сразу их использовать, например при асинхронном ивенте чата. И так, когда игрок пишет в чат мне нужно взять какие-то данные из BungeeCord'a и использовать их сразу в этом же ивенте. Я думал над бесконечным циклом, который будет блокировать поток, пока мы не получим ответ, но вроде как есть более правильные блокирующие операции, (знаком лишь с BlockingQueue), но тут я подумал, что по сути эти блокирующие операции тоже могут быть основаны на бесконечных циклах, тогда зачем мне их использовать?
В общем, есть ли преимущество использования блокирующие операции, перед циклами? Если да, то какая мне подойдёт?

PS. Да, я в курсе, что нельзя блокировать поток чата. Ивент приведён лишь в пример, в действительности у меня будет иная задача в отдельном потоке для неё.
 
Блокировки лучше в вопросах вычислений.
Они не основаны на бесконечных циклах, они основаны на управлении потоками. Если совсем просто, то когда поток ждет в блокирующем методе, система отдает вычисления другим потокам.
При этом бесконечный цикл постоянно тратит небольшой ресурс вычисления на проверки условий (условия входа в цикл, возможно еще проверки в теле).

Ивент приведён лишь в пример, в действительности у меня будет иная задача в отдельном потоке для неё.
Раз ты все таки не собираешься блокировать главный поток - то неплохим вариантом будут FutureTask, как вариант ComplatableFuture
Просто в самом ивенте запускаешь свой код (в котором уже будет блокировка до получения результата) через этот самый Future.
По поводу какой лок использовать - тут типичная задача "о поставщике и потребителе" (рекомендую посмотреть лекции тут)
 
BungeeCord как и майнкрафт на неблокирующем сокете. Ивент слушатель идет отдельно.
 
BungeeCord как и майнкрафт на неблокирующем сокете. Ивент слушатель идет отдельно.
А разве существуют неблокирующие сокеты? UDP разве что, но не думаю, что Bungee использует их. В любом случае я не использую этот ивент, мне пришлось писать свою передачу, так как меня не устроила скорость того, что Bungee предоставляет.


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


Раз ты все таки не собираешься блокировать главный поток - то неплохим вариантом будут FutureTask, как вариант ComplatableFuture
Просто в самом ивенте запускаешь свой код (в котором уже будет блокировка до получения результата) через этот самый Future.
По поводу какой лок использовать - тут типичная задача "о поставщике и потребителе" (рекомендую посмотреть лекции тут)
Хорошо, спасибо, попробую...
 
А разве существуют неблокирующие сокеты? UDP разве что, но не думаю, что Bungee использует их. В любом случае я не использую этот ивент, мне пришлось писать свою передачу, так как меня не устроила скорость того, что Bungee предоставляет.



Хорошо, спасибо, попробую...
Конечно существуют, на них весь netty, а майнкрафт (С 1.8) и банджа сделана на нетти, так что там все на неблокирующих сокетах. (опять же про них есть в том плейлисте (ближе к концу) который я тебе кинул выше)
 
Назад
Верх