我有一个多线程服务器应用程序。其中一个Runnables使用无限循环来检查连接。这是使用socket = serverSocket.accept()
完成的,这是一个阻止调用。
当我关闭我的服务器时,我想阻止所有线程执行。
我尝试了threadExecutor.shutdown()
和threadExecutor.shutdownNow()
。
这些功能似乎都没有杀死我上面提到的线程。
你能帮我解决一下吗? 提前谢谢!答案 0 :(得分:3)
当我关闭我的服务器时,我想阻止所有线程执行。
当某个帖子在serverSocket.accept()
中被阻止时,阻止它的唯一方法就是从其下方关闭serverSocket
。然后,accept调用将抛出一个IOException
,可以捕获该线程,然后该线程将退出。
如果你还需要停止客户端处理程序线程,那么你需要让它们监听线程中断。中断线程并不会阻止它运行,但会在线程上设置中断标志,并会导致抛出InterruptedException
的任何方法。要中断ExecutorService
中的线程,您可以调用threadExecutor.shutdownNow()
。但是,这不会中断accept()
调用。
通常在线程句柄循环中,我们执行以下操作:
while (!Thread.currentThread().isInterrupted()) {
...
}
答案 1 :(得分:2)
可能的解决方案:在服务器关闭期间连接到套接字并写入 STOP 消息。收到此 STOP 消息后,让线程break
退出无限循环。