【发布时间】:2011-04-11 15:28:48
【问题描述】:
我有以下 TCP 客户端-服务器通信结构:
- 在服务器启动时服务器启动 接受者线程,接受客户端 连接和传递 ServerSocket 给它。
- 当客户端连接到达时, 接受者线程调用accept() ServerSocket 并提交客户端 处理工作到工作线程 (通过执行程序/线程池)并为其提供客户端套接字。
- 循环中的工作线程从 客户端套接字流,对其进行处理并发送回复。
问题是如何优雅地停止整个系统?我可以通过关闭 ServerSocket 来停止接受线程。它将导致accept() 阻塞调用抛出SocketException。但是如何阻止工人呢?他们从流中读取,这个调用被阻塞了。根据this,流不会抛出 InterruptedException,因此工作者不能被中断()。
看起来我需要从另一个线程关闭工作套接字,对吧?为此,应将套接字设为公共字段,或者应在 worker 中提供关闭它的方法。这会好吗?或者可能是我的整个设计有缺陷?
【问题讨论】:
标签: java multithreading concurrent-programming