В моем основном потоке у меня есть a while(listening)
цикл, который звонит accept()
на моем объекте ServerSocket, затем запускает новый клиентский поток и добавляет его к Набору, когда новый клиент принят.
Я также сделал, чтобы Администратор распараллелил, который я хочу использовать для выдачи команд, как 'выход', который заставит все клиентские потоки быть закрытыми, завершает работу себя и закрывает основной поток путем превращения слушания лжи.
Однако accept()
призовите while(listening)
блоки цикла, и там, кажется, не способ прервать его, таким образом, в то время как условие не может быть проверено снова и программа не может выйти!
Существует ли лучший способ сделать это? Или некоторый способ прервать метод блокирования?
Вы можете вызвать close ()
из другого потока, и вызов accept ()
вызовет исключение SocketException
.
Установите таймаут на accept()
, тогда вызов отключит блокировку через указанное время:
http://docs.oracle.com/javase/7/docs/api/java/net/SocketOptions.html#SO_TIMEOUT
Установите таймаут на блокировку
Socket
операций:ServerSocket.accept(); SocketInputStream.read(); DatagramSocket.receive();
Опция должна быть установлена до ввода блокирующей операции, чтобы она вступила в силу. Если таймаут истекает, а операция продолжает блокироваться,
java.io.InterruptedIOException
будет поднят. СокетSocket
в этом случае не закрывается.
Вызов close ()
в ServerSocket
как вариант?
http: / /java.sun.com/j2se/6/docs/api/java/net/ServerSocket.html#close%28%29
Закрывает этот сокет. Любой поток, заблокированный в настоящее время в accept (), вызовет SocketException.