2013-12-14 4 views
2

Я пишу многопоточное приложение в моем методе 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 ??

Спасибо.

ответ

3

Причина, по которой вы не добавляете общедоступные методы в класс Thread, является именно тем, что возникает такая путаница - существует интуиция, согласно которой сам класс Thread сам владеет выполнением этих методов, тогда как в Java это всегда - вызывающий поток, которому принадлежит исполнение.

Когда поток EDT вызывает ServerThread.disconnect(id), код в методе разъединения запускается потоком EDT, а не ServerThread. Ключевым моментом здесь является то, что Thread ServerThread и Объект ServerThread - это не то же самое, семантически говоря - объект не может быть «заблокирован» таким же образом, что и Thread, выражение doesn ' t даже имеет смысл.

+0

Спасибо за ответ @torquestomp, поэтому в моем случае мне нужно создать новый класс 'Server', который содержит ссылки подключенных клиентов и потоки обработчика, он также содержит другие общедоступные методы, с которыми я могу закрыть соединение конкретного клиента. Новый 'ServerThread' не делает ничего другого, кроме как ждать новых входящих соединений и сохраняет ссылку на поток обработчика в объекте' Server'. EDT манипулирует потоками обработчиков с использованием общедоступных методов объекта 'Server', которые могут быть получены с помощью singleton' Server.getInstance() '. Так лучше? – vesontio

+0

Так что не рекомендуется публиковать метод в потоке, но это не запрещено, так как мне все еще нужен метод 'public void shutdown()', который превращает флаг 'running' в' false' и останавливает 'ServerThread'. – vesontio

+1

@vesontio Не рекомендуется распространять Thread на всех. Практически никогда не бывает веских оснований для этого, и ваше дело, конечно, не нуждается в этом. –

Смежные вопросы