Как можно писать однопоточные программы на основе событий? - PullRequest
0 голосов
/ 21 февраля 2019

Мое знание тем очень ограничено.Я оказался парнем, который может писать многопоточные программы, но просто копируя их и находя ответы на мои вопросы в Интернете.Но я наконец решил немного узнать о параллелизме и купил книгу «Параллелизм Java на практике».Прочитав пару страниц, я уверен, что многому научусь из этой книги.

Может быть, я немного нетерпелив, но не могу удержаться от соблазна задать этот вопрос.Это заставило меня создать аккаунт в Stack Overflow.Я не уверен, что смогу правильно сформулировать вопрос, поэтому я попытаюсь объяснить свой вопрос на примере.

Если бы мне пришлось написать (крайне непрофессионально) одноранговыйскажем, в чате клиента на Java я буду устанавливать сокетное соединение между клиентами и поддерживать его, потому что сообщения могут поступать в любое время.Решение, которое я могу себе представить, заключается в том, чтобы открыть соединение с сокетом в новом потоке и непрерывно выполнять цикл while, чтобы сохранить поток живым, так как поток умирает, как только возвращается run.По какой-то причине я не могу представить похожий чат-клиент в однопоточной программе.Как вы можете продолжать «ждать», пока не прибудет сообщение, если все, что у вас есть, это один поток.Разве это не блокирует выполнение всей программы?

Чтобы решить такую ​​проблему, какова альтернатива непрерывному циклу while?

1 Ответ

0 голосов
/ 21 февраля 2019

Как вы можете «ждать», пока не прибудет сообщение, если все, что у вас есть, - это один поток.ваше приложение.Представьте себе официанта в ресторане.Всего один парень.Он ходит от одного клиента к другому и записывает заказы.Время от времени он подходит к прилавку, распределяет заказы и подбирает все, что ему оставил шеф-повар.Просто один парень, гуляющий вокруг, выполняющий работу «с одним заданием».Но в конце концов, общая система по-прежнему имеет несколько актеров (гости, официант, шеф-повар, парень за барной стойкой, готовящий напитки).Таким образом, официант может рассматриваться как «однопоточный», но в итоге общая система «ресторан» не является.

Некоторые ИТ-архитектуры «имитируют» это, например, вокруг идеи «неблокировка "IO.Вот как работает node.js.Он однопоточный по своей природе, но выполняет асинхронный ввод-вывод (подробности см. здесь ).И вы можете делать аналогичные вещи и с Java.

С другой стороны, когда вы узнаете о параллелизме, вы все равно хотите узнать о «реальной» многопоточности, что это значит и как вы будете писатькод для «использования» этой концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...