gpt4 book ai didi

java - Selector.select(超时) x Selector.selectNow()

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:20:35 26 4
gpt4 key购买 nike

我正在用 Java 实现一个非阻塞 HTTP 服务器,并决定使用纯 Java NIO。我将一个 NIO 选择器与一个小线程池结合起来,以执行选择器指示的操作。

让系统选择默认选择器(在 Linux 2.6 epoll 和 Mac OS Snow Leo KQueue 中测试)并使用 Selector.select(TIMEOUT); 我得到处于 Monitor 状态的线程池 (等待获取监视器),而主线程(运行选择器事件循环)始终保持运行状态。在某些情况下,Monitor 状态(等待获取 Monitor 的时间)会浪费超过 10s。

使用以下方法会导致主线程大部分时间都在 hibernate ,更少(几乎没有监控池线程的状态)和更好的吞吐量(每秒处理 1k 个请求):

    while (true) {
Thread.sleep(IOLoop.SELECT_TIMEOUT);
if (selector.selectNow() == 0)
continue;

Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
//...
}

有谁知道这个决定的影响/风险,或者如何减轻/消除尝试使用带超时的选择器选择方法获取对象监视器所花费的时间?

谢谢。

最佳答案

Selector api 和 sun 的 impl 很糟糕。

该文档允许您在一个选择器的 select() 上阻塞多个线程,但这样做没有意义。你应该只有一个线程阻塞在一个 selector.select() 上。

而实际的实现只是在 select() 中执行 syncrhonized(this) 以实现线程安全。

这就像过去过度同步的 Vector 和 Hashtable。

他们应该简单地公开低级原始非阻塞方法,而不是将它们包装在那么多保姆抽象中——普通程序员不会使用选择器,那些使用选择器的人可以自己照顾自己。

关于java - Selector.select(超时) x Selector.selectNow(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3242685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com