java - 如何在具有 I/O 多路复用的 Java 服务器中异步处理请求?

标签 java multithreading sockets

假设我正在编写一个 Java 服务器,它通过 TCP/IP 与客户端通信。

服务器使用I/O 多路复用。有一个线程 T0,它等待 selector 并处理客户端连接。例如,如果连接已准备好读取,则 T0 会从连接中读取数据。

假设服务器已经读取了传入的请求,现在它已准备好处理它。由于处理需要时间,请求在另一个线程 T1 中处理,T0 返回以等待选择器。

假设 T1 已经完成处理并创建了一个响应。现在 T0 应该开始写入对客户端连接的响应。所以我的问题是:T1 如何将响应发送到 T0

最佳答案

同一个线程 T1 应该读取、处理并将结果返回给客户端。

这里概述了如何使用 java nio api 在不将线程数与客户端数相关联的情况下执行此操作。

**//Thread T0** //wait for selection keys
...
Iterator it = selector.selectedKeys().iterator( );

while (it.hasNext( )) { 
    SelectionKey key = (SelectionKey) it.next();
    // Is a new connection coming in? 
    if (key.isAcceptable( )) {
        ServerSocketChannel server = (ServerSocketChannel) key.channel();
        SocketChannel channel = server.accept()
        // Set the new channel nonblocking
        channel.configureBlocking (false);
        // Register it with the selector
        channel.register (selector, SelectionKey.OP_READ);
    }

    // Is there data to read on this channel?
    if (key.isReadable( )) {
       processRequest (key);
    }

    it.remove( );
}

...

ExecutorService service = Executors.newFixedThreadPool(50);
...
void processRequest(final SelectionKey key) {

    **//Thread T1-T50** //deal with request
    executorService.submit(new Runnable() {            
        SocketChannel channel = (SocketChannel) key.channel();

        //read data from channel, process it and write back to the channel.
    });
)
}

关于java - 如何在具有 I/O 多路复用的 Java 服务器中异步处理请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26085099/

相关文章:

c++ - 在多线程应用程序中使用智能指针

c++ - 使用 C++11 线程确保每个线程都有机会在给定时间段内执行

sockets - 我需要 `ping` 连接的 websocket 连接吗?

java - 调整 SplitPane 的大小以适合 AnchorPane 父级

java - 如何解决这个: Exception evaluating SpringEL expression: "#authorization.expression(' isAuthenticated( )')"?

java - 实时更新 ListView JavaFX

ios - 在 iOS 中使用 Socket 上传和流式传输视频

java - 线程化java服务器只发送一个文件

java - 从 jsoup 的嵌套 href 检索数据

java - 在java中,在另一个类中使用一个类的变量