Java: nice way to stop threaded TCP server?

У меня есть следующая структура для TCP-связи клиент-сервер:

  • При запуске сервера запускается сервер акцепторный поток, который принимает клиента подключения и передает ServerSocket к нему.
  • Когда приходит клиентское соединение, поток-приемник вызывает accept () на ServerSocket и отправляет клиента обработка задания в рабочий поток (исполнителем / пулом потоков) и предоставляет ему клиентский сокет.
  • Рабочий в цикле считывает данные из client socket stream, processes it and sends replies.

The question is how to gracefully stop the whole system? I can stop acceptor thread by just closing ServerSocket. It will cause accept() blocking call to throw SocketException. But how to stop workers? They read from stream and this call is blocking. According to this streams does not throw InterruptedException and thus worker cannot be interrupt()'ed.

It looks like I need to close worker socket from another thread, right? For this, socket should be made a public field or a method should be provided in worker to close it. Will this be nice? Or may be my whole design is flawed?

5
задан Vladislav Rastrusny 11 April 2011 в 15:28
поделиться