Можете ли вы выбросить исключение в родительский поток - PullRequest
0 голосов
/ 04 мая 2019

Я должен реализовать примитивный многопоточный сервер, который запускает новый поток для каждого соединения.

Возможно, что один из потоков получит сообщение о завершении работы сервера.

Можно ли уведомить родительский поток от одного из дочерних потоков, чтобы он прекратил принимать новые подключения и выключил сервер?

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Существует несколько способов связи между потоками:

  1. Вы можете сохранить общее состояние (корень зла в многопоточности) и обновите его и позвольте основному потоку проверить это состояние несколько раз (использовать летучие или барьеры)
  2. При создании рабочего потока вы можете передать экземпляр основного потока, и если какой-либо поток в любой точке хочет остановить основной поток, он может вызвать метод основного потока, чтобы остановить принимать дальнейшие запросы (более оптимизировано, чем предыдущее решение).
0 голосов
/ 04 мая 2019

Как вы, вероятно, знаете, у вас может быть общая переменная для нескольких потоков.

Вы можете использовать логическую переменную, скажем, exceptionOccured или serverShutdown, которая по умолчанию будет false, а в обработчиках исключений в каждом потоке вы устанавливаете эту переменную в true.

В главном потоке вы будете следить за значениями этой переменной и выполнять необходимую работу в случае, если эта переменная станет true (т.е. остановить все потоки и т. Д.).

Чтобы реализовать это, вы должны сначала прочитать о volatile ключевое слово

...