Java ThreadExecutor在无限循环中强制执行线程

Java ThreadExecutor在无限循环中强制执行线程,java,multithreading,Java,Multithreading,我有一个多线程服务器应用程序。其中一个Runnable使用无限循环来不断检查连接。这是使用socket=serverSocket.accept()完成的,这是一个阻塞调用 当我关闭服务器时,我想停止所有线程的执行。 我尝试了threadExecutor.shutdown()和threadExecutor.shutdownNow() 这些函数似乎都没有杀死我上面提到的线程 你们能帮我一下吗? 提前谢谢 当我关闭服务器时,我想停止所有线程的执行 当线程在serverSocket.accept()中被

我有一个多线程服务器应用程序。其中一个Runnable使用无限循环来不断检查连接。这是使用
socket=serverSocket.accept()
完成的,这是一个阻塞调用

当我关闭服务器时,我想停止所有线程的执行。 我尝试了
threadExecutor.shutdown()
threadExecutor.shutdownNow()

这些函数似乎都没有杀死我上面提到的线程

你们能帮我一下吗? 提前谢谢

当我关闭服务器时,我想停止所有线程的执行

当线程在
serverSocket.accept()
中被阻塞时,停止它的唯一方法是从它下面关闭
serverSocket
。然后,accept调用将抛出一个
IOException
,可以捕获该异常,然后线程应该退出

如果您还需要停止客户端处理程序线程,那么您需要让它们侦听线程中断。中断线程不会阻止它运行,但它会在线程上设置中断标志,并会导致抛出
InterruptedException
的任何方法抛出。要中断
ExecutorService
中的线程,可以调用
threadExecutor.shutdownNow()
。但是,这不会中断
accept()
调用

通常在线程句柄循环中,我们执行以下操作:

while (!Thread.currentThread().isInterrupted()) {
   ...
}
当我关闭服务器时,我想停止所有线程的执行

当线程在
serverSocket.accept()
中被阻塞时,停止它的唯一方法是从它下面关闭
serverSocket
。然后,accept调用将抛出一个
IOException
,可以捕获该异常,然后线程应该退出

如果您还需要停止客户端处理程序线程,那么您需要让它们侦听线程中断。中断线程不会阻止它运行,但它会在线程上设置中断标志,并会导致抛出
InterruptedException
的任何方法抛出。要中断
ExecutorService
中的线程,可以调用
threadExecutor.shutdownNow()
。但是,这不会中断
accept()
调用

通常在线程句柄循环中,我们执行以下操作:

while (!Thread.currentThread().isInterrupted()) {
   ...
}


可能的解决方案:在服务器关闭期间,连接到套接字并写入停止消息。接收到此停止消息后,使线程从无限循环中断开。

可能的解决方案:在服务器关闭期间,连接到套接字并写入停止消息。接收到此停止消息后,使线程从无限循环中断开。

您必须设置
超时
,并使用它定期检查是否请求终止。如果是这样-打破无限循环-注意这意味着应该执行挂起的任务,并且不会接受新任务。不要将阻塞任务提交到线程池。在不同的线程上运行它们。您必须设置一个
超时
,并使用它定期检查是否请求终止。如果是这样-打破无限循环-注意这意味着应该执行挂起的任务,并且不会接受新任务。不要将阻塞任务提交到线程池。在不同的线程上运行它们。但这需要来自的消息client@SvetlinZarev,它需要消息,但不需要来自客户端。服务器可以像客户端一样连接到自己的侦听TCP/IP套接字。如果我错了,请纠正我的错误,但接受此连接将导致由于调用
accept()
而创建一个新的
socket
,最有可能的是,它将在一个单独的线程中处理,
ServerSocket
将再次阻塞,等待接受下一个线程connection@SvetlinZarev,它不必在单独的线程中处理。即使它被传递给另一个
Runnable
,它也会立即退出,因为它与任何事情都无关。OP可以决定如何处理这个问题。这个答案提供了一个非常简单的机制来立即唤醒服务器线程。OP可以设置一个标志,指示在调用
accept()
之前需要关闭,或者让服务器线程窥视传入数据以检测停止消息。但这需要来自的消息client@SvetlinZarev,它需要消息,但不需要来自客户端。服务器可以像客户端一样连接到自己的侦听TCP/IP套接字。如果我错了,请纠正我的错误,但接受此连接将导致由于调用
accept()
而创建一个新的
socket
,最有可能的是,它将在一个单独的线程中处理,
ServerSocket
将再次阻塞,等待接受下一个线程connection@SvetlinZarev,它不必在单独的线程中处理。即使它被传递给另一个
Runnable
,它也会立即退出,因为它与任何事情都无关。OP可以决定如何处理这个问题。这个答案提供了一个非常简单的机制来立即唤醒服务器线程。OP可以设置一个标志,指示在调用
accept()
之前需要关闭,或者让服务器线程窥视传入的数据以检测停止消息。这看起来更像是对我的黑客攻击,而不使用NIO代码,这是从服务器端@SvetlinZarev执行此操作的唯一方法。这是一个非常典型的模式。@Gray我试图关闭serverSocket并捕获SocketException。真管用,谢谢!这本身可能是一个不同的问题,但是当我关闭serverSocket时,为什么我的客户机仍然可以与我的服务器通信?因为客户机正在处理一个接受的套接字@Noiseloop。一旦你建立了连接,你就可以关闭服务器套接字,而这不会影响任何已经连接的客户端。这看起来更像是对我的一次黑客攻击,而不使用NIO代码,这是从服务器上实现这一点的唯一方法