Java 如何终止从ExecutorService派生的线程

Java 如何终止从ExecutorService派生的线程,java,multithreading,sockets,thread-safety,threadpool,Java,Multithreading,Sockets,Thread Safety,Threadpool,我有以下问题: 我正在运行一个服务器,该服务器与所有在由ExecutorService生成的单独线程中连接的客户端建立TCP连接。我有一个exit命令,它应该终止服务器,包括ExecutorService生成的所有线程。在与客户机相关的每个特定线程中,我有一个while-循环,在该循环中,我使用相关套接字的InputStream等待客户机的输入。我还有一个全局boolean变量,它指示服务器是否在线。一旦它变成false,我就会中断循环并终止线程。基本上是这样的: // userInput -

我有以下问题:

我正在运行一个服务器,该服务器与所有在由
ExecutorService
生成的单独
线程中连接的客户端建立TCP连接。我有一个exit命令,它应该终止服务器,包括
ExecutorService
生成的所有线程。在与客户机相关的每个特定
线程中,我有一个
while
-循环,在该循环中,我使用相关套接字的
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
}

但是,问题是.readLine()中的
是一个阻塞操作,因此除非所有客户端都键入某个内容,否则不会终止整个服务器<代码>ExecutorService.Shutdownow()
也无法工作,因为在这种情况下中断无效,因为线程被另一个操作阻塞。我还想避免
System.exit()
。任何有效的解决方案?

尝试关闭所有客户端套接字。在这种情况下,所有读取线程都应该抛出IOException。

我认为BufferedReader的可能副本在中断时会抛出IOExection。我将尝试进行实验。对System.exit的调用将终止所有正在运行的线程,不会询问任何问题。这是“艰难”的方式。忘记提到我想避免艰难的方式,编辑了这篇文章。我应该怎么做?我没有记录使用的插座。它们是在相应客户端的派生线程中创建的,因此我无法访问它。是的,您应该跟踪所有套接字。您可以通过将套接字传递给某个共享持有者对象来实现这一点。即插座s=。。。;holder.add(s)
我认为这不是解决这个问题的最佳方法,但它奏效了,所以我会接受你的答案。