【问题标题】:How to terminate Thread spawned from ExecutorService如何终止从 ExecutorService 产生的线程
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我该怎么做?我不跟踪使用的套接字。它们是在为各个客户端生成的线程中创建的,因此我无权访问它。
  • 是的,您应该跟踪所有套接字。您可以通过将套接字传递给某个共享持有者对象来做到这一点。 IE。 Socket s = ...; holder.add(s)
  • 我不认为这是解决此问题的最佳解决方法,但它确实有效,所以我会接受您的回答。
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2019-01-27
  • 2016-08-31
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多