我正在阅读netty 4源代码。eventLoop.inEventLoop()随处可见。据Netty说:
一个通道在其生命周期内使用单个EventLoop进行注册。可以将单个EventLoop分配给一个或多个信道。通道有并且只有一个事件循环/线程。
理论上,eventLoop.inEventLoop()是确保代码块由指定的事件循环/线程执行。此外,如果您从非io线程调用某些内容,则eventLoop.inEventLoop()将变为false,并将由已分配的事件循环/线程执行。
例如,下面的代码转到其他块(NioSocketChannel$NioSocketChannelUnsafe(AbstractChannel$AbstractUnsafe).register(EventLoop, ChannelPromise)),其中没有注册通道(分配给事件循环/线程)。
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
发布于 2020-01-04 00:49:05
这种代码确保只有正确的事件循环/线程才能处理/更改Channel对象。当只有一个特定线程可以与Channel对象一起工作时,这解决了许多争用条件和多线程问题。这与所谓的“线程安全”有关,如果或者如果不是,类被认为是“线程安全”。该代码可阅读如下:
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();// .}.
https://stackoverflow.com/questions/59577360
复制相似问题