【问题标题】:Is it possible to make blocking java socket read non active waiting?是否可以使阻塞java套接字读取非活动等待?
【发布时间】:2021-01-25 10:59:07
【问题描述】:

我有一个应用程序需要打开数千个套接字连接并等待消息。客户端正在使用 java 阻塞套接字读取。这意味着我将只能有 N 个并发打开的连接(基于线程集的执行程序数),因为所有 N 个线程都将在活动等待(RUNNABLE 状态)时被阻塞

有没有办法让这些套接字读取以在数据可用时“唤醒”线程(以与 NIO 套接字相同的方式)?

即当前行为 线程池(4 个线程)

  • socketRead0(..) - 可运行
  • socketRead0(..) - 可运行
  • socketRead0(..) - 可运行
  • socketRead0(..) - 可运行

没有更多的线程可以执行

期望的行为 线程池(4 个线程)

  • socketRead0(..) - 等待(停车)
  • socketRead0(..) - 等待(停车)
  • socketRead0(..) - 等待(停车)
  • socketRead0(..) - 等待(停车)
  • socketRead0(..) - RUNNABLE(正在执行读取并将返回数据)

这样,另一个线程可以在其他线程等待时启动并执行套接字读取数据可用

注意:我知道这可以通过 NIO 实现,但想知道如何将这种行为转移到旧版同步调用(如果可能) 谢谢

【问题讨论】:

    标签: java multithreading sockets


    【解决方案1】:

    答案是否定的。 java.net.SocketInputStream 的所有方法都是阻塞的。 InputStream.available() 未实现,始终返回 0。 如果没有 NIO,唯一的方法是每个套接字使用一个线程。

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多