Убойная нить в яве - PullRequest
       18

Убойная нить в яве

1 голос
/ 18 марта 2012

Я создаю серверную клиентскую программу, где клиент отправляет определенную информацию на сервер и получает соответствующий ответ от сервера. Для непрерывного прослушивания от нескольких клиентов у меня есть поток на сервере, который постоянно прослушивает запрос клиента. при получении запроса я запускаю другой поток и отправляю этот сокет для запуска и начинаю прослушивать запрос других клиентов.

вот код для непрерывного прослушивания

while(true){
    //serverListener is a ServerSocket object
    clientSocket = serverListener.accept();//Waiting for any client request

    //New thread started when request is received from any client
    Thread thread =new Thread(new serverThread(clientSocket), "ClientThread");
    thread.start();
}

Теперь моя проблема в том, как я могу остановить сервер. Я знаю одну альтернативу использования переменной boo lean в цикле while и последующем изменении значения, но проблема в том, что когда поток ожидает получения какого-либо соединения в это время, изменение значения логической переменной также не остановит сервер.

Есть ли способ решить эту проблему.

Ответы [ 3 ]

3 голосов
/ 18 марта 2012

Обычно serverListener (который я предполагаю на самом деле ServerSocket или что-то) закрывается другим потоком.Это сгенерирует java.net.SocketException in accept(), который завершит цикл и поток.

final ServerSocket serverSocket = new ServerSocket(8000);
new Thread(new Runnable() {
    public void run() {
        while (true) {
            try {
                serverSocket.accept();
            } catch (IOException e) {
                return;
            }
        }
    }
}).start();
Thread.sleep(10000);
serverSocket.close();
0 голосов
/ 18 марта 2012
volatile boolean finishFlag = false;

while(true){

            clientSocket = serverListener.accept();//Waiting for any client request

            if ( finishFlag ) 
               break;

            //New thread started when request is received from any client
            Thread thread =new Thread(new serverThread(clientSocket), "ClientThread");
            thread.start();
}

EDIT:

для прерывания прослушивателя, вы должны остановить этот поток извне, а затем accept () выдаст IOException

    try {  
      while (true) {   
        Socket connection = server.accept( );

        try {    
          // any work here    
          connection.close( );
       }
       catch (IOException ex) {
         // maybe the client broke the connection early.
       }

       finally {
       // Guarantee that sockets are closed when complete. 
       try {
          if (connection != null) connection.close( );
       }
       catch (IOException ex) {}
    }    
  }    
  catch (IOException ex) {
    System.err.println(ex);
  }
0 голосов
/ 18 марта 2012

ServerSocket # setSoTimeout () может вас заинтересовать, который откажется от подтверждения, если истекло время ожидания.Помните, что нужно перехватить исключение SocketTimeoutException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...