首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在什么情况下eventloop.inEventLoop() ==是假的?

在什么情况下eventloop.inEventLoop() ==是假的?
EN

Stack Overflow用户
提问于 2020-01-03 10:59:24
回答 1查看 560关注 0票数 0

我正在阅读netty 4源代码。eventLoop.inEventLoop()随处可见。据Netty说:

一个通道在其生命周期内使用单个EventLoop进行注册。可以将单个EventLoop分配给一个或多个信道。通道有并且只有一个事件循环/线程。

理论上,eventLoop.inEventLoop()是确保代码块由指定的事件循环/线程执行。此外,如果您从非io线程调用某些内容,则eventLoop.inEventLoop()将变为false,并将由已分配的事件循环/线程执行。

例如,下面的代码转到其他块(NioSocketChannel$NioSocketChannelUnsafe(AbstractChannel$AbstractUnsafe).register(EventLoop, ChannelPromise)),其中没有注册通道(分配给事件循环/线程)。

代码语言:javascript
复制
if (eventLoop.inEventLoop()) {
    register0(promise);
} else {
    try {
        eventLoop.execute(new Runnable() {
            @Override
            public void run() {
                register0(promise);
            }
        });
    } catch (Throwable t) {
...
    }
}

我真的很困惑,eventLoop.inEventLoop()有什么意义?eventLoop.inEventLoop()保护什么?

除了上面的例子之外,您能否在实践中给我一些更具体的例子来演示为什么和如何使用eventloop.inEventLoop() == false?你叫什么样的代码?你打电话到哪里?代码如何使eventloop.inEventLoop() == false

EN

回答 1

Stack Overflow用户

发布于 2020-01-04 00:49:05

这种代码确保只有正确的事件循环/线程才能处理/更改Channel对象。当只有一个特定线程可以与Channel对象一起工作时,这解决了许多争用条件和多线程问题。这与所谓的“线程安全”有关,如果或者如果不是,类被认为是“线程安全”。该代码可阅读如下:

代码语言:javascript
复制
if (amIOnTheCorrectThread()) {
    doTheActualWork(); // I do the work
} else {
   scheduleOnTheCorrectThread.performAction({ doTheActualWork(); }); // let him do the work
}

取决于您是否位于正确的线程上,工作将直接完成(在正确的线程上),或者任务被卸载到正确的线程上,以便其他线程完成工作。另一个线程通过有一个没完没了的循环并检查是否有任何新的任务来执行。作为一个示例,请检查io.netty.channel.ThreadPerChannelEventLoop类的io.netty.channel.ThreadPerChannelEventLoop方法:

@重写受保护的void (){ for (;;) { Runnable task = takeTask();if (任务!= null) { task.run();// .}.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59577360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档