Java:停止线程TCP服务器的好方法?

Vla*_*sny 5 java multithreading concurrent-programming

我有以下TCP客户端 - 服务器通信结构:

  • 在服务器启动服务器上启动接受器线程,它接受客户端连接并将ServerSocket传递给它.
  • 当客户端连接到达时,接受者线程调用ServerSocket上的accept()并将客户端处理作业提交给工作线程(通过执行器/线程池)并向其提供客户端套接字.
  • 循环中的Worker从客户端套接字流中读取数据,处理它并发送回复.

问题是如何优雅地停止整个系统?我可以通过关闭ServerSocket来停止接受器线程.它会导致accept()阻塞调用抛出SocketException.但是如何阻止工人呢?他们从流中读取并且此调用正在阻止.根据这个流不会抛出InterruptedException,因此worker不能被中断().

看起来我需要从另一个线程关闭工作套接字,对吗?为此,套接字应该是一个公共字段,或者应该在worker中提供一个方法来关闭它.这会不错?或者可能是我的整个设计有缺陷?

Joh*_*int 3

您的模型工作正常。中断不可中断结构(如 IO)的最佳方法是关闭套接字。当然,您可以在进入阻塞状态之前处理它,但是如果 IO 函数不对中断做出反应,您实际上没有很多好的选择