【问题标题】:Java single-threaded multi-user chat programJava单线程多用户聊天程序
【发布时间】:2014-10-01 21:43:05
【问题描述】:

所以我正在从事这个休闲项目,以了解有关 java 网络的更多信息,到目前为止,我遇到的每个教程或文档都涉及为每个客户端连接创建一个新线程以等待输入。我想知道是否可以使用单个线程处理客户端连接列表?我尝试执行类似以下代码的操作,但没有成功。

while(true){
     for(Client c : list){
          DataInputStream dis = new DataInputStream(c.getSocket().getInputStream());
          if(dis.readLine()!=null){
               //Code
          }
          dis.close();
     }
}

【问题讨论】:

  • 为什么会出现线程厌恶综合症问题?为什么不简单地使用后台线程?另外,据我所知,如果没有多个线程,这是不可能的。
  • 事实上,没有真正的方法可以绝对杀死我所知道的线程
  • 就让线程代码跑完。那会杀了它。并且一定要使用一个线程池来限制线程的数量。
  • 如果说run()方法中没有循环,它只是一个println(),当它到达终点时它就死了?

标签: java multithreading sockets networking


【解决方案1】:

是的,使用 NIO 包的单线程是可能的。这将允许您在单个线程中跨通道设置非阻塞 IO 和多路复用。这不是微不足道的,但有一个不错的例子here

上面的示例将阻塞 readLine() 调用,直到 Socket 上有数据可用。如果您的一个客户端正在等待数据,则 while 循环将永远不会继续,您将永远不会为其他客户端提供服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多