Я пишу многопоточное приложение в моем методе ServerThread.run()
, я использую ServerSocket.accept()
для получения нового входящего соединения. Каждый раз, когда приходит новое соединение, ServerThread
создает другой поток с именем ClientHandler
для обработки соединения (получение/отправка данных), а в моем ServerThread
у меня есть java.util.HashMap<ClientHandler, Socket>
для хранения ссылок подключенных клиентов и соответствующих сокетов.Как Java обрабатывает общедоступные методы в потоке
В моей ServerThread
, я реализовал несколько других общедоступных методов, таких как shutdown()
, чтобы остановить поток сервера, disconnect(int id)
для выключения подключения конкретного клиента и т.д. Эти методы, как правило, вызывается мой GUI, из EDT нить.
Я протестировал код, он работает, но я не уверен, что это лучший способ сделать это. Я прочитал много учебников по многопоточности Java, но они не добавляют другие общедоступные методы в свой подклассу java.lang.Thread
.
Особенно в моем ServerThread.run()
, я использовал метод ServerSocket.accept()
, который, как предполагается, блокирование. Когда я хочу выключить свой ServerThread
, мне нужно позвонить ServerSocket.close()
, чтобы остановить поток.
Однако, когда я звоню, например, ServerThread.disconnect(int id)
, чтобы закрыть соединение удаленного клиента, он работает. Предполагается ли, что ServerThread
блокирует метод accept()
?
Итак, мой код работает, , но я не знаю, почему, и я хотел бы знать, если можно добавить другие публичные методы в пользовательском подклассе java.lang.Thread
??
Спасибо.
Спасибо за ответ @torquestomp, поэтому в моем случае мне нужно создать новый класс 'Server', который содержит ссылки подключенных клиентов и потоки обработчика, он также содержит другие общедоступные методы, с которыми я могу закрыть соединение конкретного клиента. Новый 'ServerThread' не делает ничего другого, кроме как ждать новых входящих соединений и сохраняет ссылку на поток обработчика в объекте' Server'. EDT манипулирует потоками обработчиков с использованием общедоступных методов объекта 'Server', которые могут быть получены с помощью singleton' Server.getInstance() '. Так лучше? – vesontio
Так что не рекомендуется публиковать метод в потоке, но это не запрещено, так как мне все еще нужен метод 'public void shutdown()', который превращает флаг 'running' в' false' и останавливает 'ServerThread'. – vesontio
@vesontio Не рекомендуется распространять Thread на всех. Практически никогда не бывает веских оснований для этого, и ваше дело, конечно, не нуждается в этом. –