Сначала я ответил на него, используя serverSocket.setSoTimeout(millis)
и обработав SocketTimeoutException
.См. Ниже.
Лучший способ сделать это - использовать ServerSocketChannel
, который прерывается при вызове accept()
при вызове thread.interrupt()
, поэтому вам вообще не нужно вращаться.Так что вы бы сделали что-то вроде:
ServerSocketChannel socketChannel = ServerSocketChannel.open();
socketChannel.socket().bind(new InetSocketAddress(this.iPort), 10);
...
while (! thisThread.isInterrupted()) {
// channel accepts _are_ interrupted by the call to thread.interrupt()
// it throws ClosedByInterruptException when interrupt() is called
SocketChannel accepted = socketChannel.accept();
new ServerThread(accepted.socket(), this.Rstr,
bag.numberofDatatoAcquire).start();
}
Я попробую объяснить код:
while(!thisThread.isInterrupted()){
new ServerThread(serversocket.accept(), this.Rstr,
bag.numberofDatatoAcquire).start();
Thread.sleep(10);
}
Я думаю, что ваша проблема здесь в том, что serversocket.accept()
висит в ожидании принятия сокета.Из accept()
javadocs :
Прослушивает подключение к этому сокету и принимает его.Метод блокируется, пока не будет установлено соединение.
Вам необходимо установить тайм-аут на вашем сокете до цикла while
.Для этого вы можете использовать setSoTimeout(millis)
.
serversocket.setSoTimeout(10000);
Затем будет выброшено SocketTimeoutException
, если истечет время ожидания.Тогда вам не понадобится Thread.sleep(10)
(что соответствует 10мс между прочим), потому что сон будет выполняться внутри метода accept()
.Я бы не рекомендовал accept(10)
, потому что это крутилось бы довольно агрессивно.