while(true)ServerSocket Listen的效率

Sub*_*ged 9 java sockets performance multithreading core

我想知道一个典型的while(true)ServerSocket监听循环是否需要整个核心等待并接受客户端连接(即使实现runnable和使用Thread .start())

我正在实现一种分布式计算集群,每台计算机都需要它拥有的每个核心用于计算.主节点需要与这些计算机通信(调用修改算法功能的静态方法).

我需要使用套接字的原因是跨平台/跨语言功能.在某些情况下,PHP将调用这些java静态方法.

我使用了一个java profiler(YourKit),我可以看到我正在运行的ServerSocket监听线程,它永远不会睡觉而且它总是在运行.有没有更好的方法来做我想要的?或者,性能影响是否可以忽略不计?

如果你能想到一个更好的方法,请随时提供任何建议(我已尝试过RMI,但不支持跨语言.

感谢大家

eri*_*son 9

如果你的意思是这样的:

while (true) {
  Socket socket = server.accept();
  /* Do something with socket... */
}
Run Code Online (Sandbox Code Playgroud)

然后,不,呼吁accept()不"采取整个核心".这是一个阻塞调用,允许在另一个线程上调度CPU,直到客户端实际连接为止.一旦调用accept()返回,当前线程将被调度为运行并将消耗CPU,直到它accept()在循环的下一次迭代中阻塞.

为了避免其他客户端的监听积压过大,另一个线程通常会处理与新接受的交互Socket,让一个线程专注于接受新客户端.套接字处理线程可以使用NIO处理许多套接字,或者它可能专用于单个套接字,这对于编码来说要简单得多,但在数百个并发连接之后不能很好地扩展.


mik*_*era 5

您可能希望查看Java 1.4 nio库,特别是ServerSocketChannel.我非常成功地使用它来实现一个高效的服务器,代码的关键部分是:

Selector selector = Selector.open();

ServerSocketChannel server= ServerSocketChannel.open();
server.socket().bind(new java.net.InetSocketAddress(port));
server.configureBlocking(false);
SelectionKey serverKey = server.register(selector, SelectionKey.OP_ACCEPT);

// start listening thread
new Thread(listener).start();
Run Code Online (Sandbox Code Playgroud)

并且监听器只是一个运行的循环:

selector.select(1000); // listen for one second max
Set<SelectionKey> keys = selector.selectedKeys();

if (keys.size()>0) {
    handleKeys(keys);
}
Run Code Online (Sandbox Code Playgroud)