Вы, вероятно, пошли дальше, но для потомков ...
что произойдет, когда у меня возникнет исключение в этой строке
clientSocket = this.serverSocket.accept();
Если вы получитеисключение внутри accept, тогда сокет не возвращается, поэтому закрывать нечего.Либо accept()
возвращает действительный сокет, который вы должны обработать, а затем закрываете , либо выдает исключение.Никогда оба.
где вызывается stop()
?
Остановка выглядит так, что она вызывается из внешнего мира каким-то вызывающим абонентом, который хочет отключить сокет сервера.На сервере вы создаете сокет-сервер, а затем принимаете отдельные подключения к удаленным клиентам, которые возвращают сокет для этого клиента.Каждый из обработчиков клиента должен закрывать свои собственные индивидуальные соединения.Когда сервер выключается (в этом случае, когда вызывается stop()
), сокет-сервер затем закрывается.
После вызова stop()
сокет сервера закрывается и метод accept()
выбросит исключение.Вот почему в коде есть проверка if(isStopped())
, чтобы исключить исключение.
как установить соединение между isStopped()
и onStop()
isStopped()
- это закрытый метод, который проверяет, вызвал ли кто-то метод stop()
.Я полагаю, onStop()
это метод Android?Они не связаны, хотя кто-то может захотеть позвонить singleThreadedServer.stop()
внутри onStop()
.
что с этим synchronized
?
Используется ключевое слово synchronizedмногопоточными программами как мьютекс и барьер памяти.Это позволяет только 1 потоку выполняться внутри блока synchronized
одновременно.Это также гарантирует, что все локальные переменные синхронизируются между потоками и центральной памятью.См. Документацию по Java:
http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
Синхронизация этого частного метода - это действительно грубая ИМО.Я предполагаю, что это делается, чтобы убедиться, что isStopped
был обновлен.Я бы использовал volatile
логическое значение или AtomicBoolean
вместо.