【发布时间】:2015-01-11 01:00:07
【问题描述】:
我有以下问题:
我正在运行一个服务器,它与由ExecutorService 生成的单独Thread 连接的所有客户端建立 TCP 连接。我有一个退出命令,它应该终止服务器,包括ExecutorService 产生的所有线程。在与客户端相关的每个特定Thread 中,我有一个while-loop,我正在使用关联套接字的InputStream 在条件中等待客户端的输入。我还有一个全局的boolean 变量,它指示服务器是否在线。一旦它变成false,我就打破循环并终止线程。它看起来基本上是这样的:
// userInput - String
// in - BufferedReader associated with the input stream of the client's socket
while ((userInput = in.readLine()) != null && serverIsOnline) {
//do some stuff
}
但是,问题在于in.readLine() 是一个阻塞操作,因此除非所有客户端都输入某些内容,否则整个服务器不会被终止。 ExecutorService.shutDownNow() 也不起作用,因为在这种情况下中断无效,因为线程被另一个操作阻塞。我也想避免System.exit()。有什么有效的解决方案?
【问题讨论】:
-
我 认为 如果 BufferedReader 被中断,它会抛出一个 IOExecption。我会尝试实验。
-
对 System.exit 的调用 将 终止所有正在运行的线程,不问任何问题。这就是“硬”的方式。
-
忘了说我想避免困难,编辑了帖子。
标签: java multithreading sockets thread-safety threadpool