乐趣区

关于java:asyncawait-Java-NIO

尽管 Java 官网有 loom 我的项目来实现协程,然而切实等不住了。既然 fanx 反对 async/await,所以就尝试和异步 IO 联合,来实现高性能网络框架。

代码见这里:fanx-dev/fanxServer。

架构相似于 netty 的 reactor 模式,像这样:

示例代码:

class TestServer : Handler {override async Void onService(Socket socket) {buf := NioBuf.makeMem(1024)
    n := await socket.read(buf, 1)
    buf.flip()
    echo("=====server receive: $buf:"+buf.readAllStr)

    buf.clear
    buf.printLine("HelloWorld")
    buf.flip
    n2 := await socket.write(buf)
    echo("=====send:"+n2)
  }

  static Void main() {
    Server {
      port = 8080
      handler = TestServer#
    }.start
  }
}

代码中,当运行到 await 的时候当前任务暂停,并交给 selector 线程去监听 IO 事件,以后线程没有阻塞而是去持续解决其余连贯工作。当 selector 发现事件就绪后告诉复原运行工作。因为采纳线程池机制 await 前后可能运行在不同的线程中。

是不是代码看起来比 netty 的回调好多了。

反对根本的 Http 协定:

class HttpTestServer : HttpHandler {override async Void onHttpService(HttpReq req, HttpRes res) {echo("Server receive:"+req.headers)
    res.headers["Content-Type"] = "text/html; charset=utf-8"

    buf := NioBuf.makeMem(1024)
    buf.printLine("<html>
                        <body>Hello World</body>
                       </html>")
    buf.flip
    //await res.writeFixed(buf)
    await res.writeChunk(buf)
  }

  static Void main() {
    Server {
      port = 8080
      handler = HttpTestServer#
    }.start
  }
}

性能方面没有测试,预计必定比阻塞 IO 好。

Java 基于协程的 IO 框架还能够应用 kilim,本我的项目也参考了 kilim 的代码。

退出移动版