gpt4 book ai didi

java - 什么情况下 eventloop.inEventLoop() == false ?

转载 作者:行者123 更新时间:2023-12-01 19:05:00 25 4
gpt4 key购买 nike

我正在阅读netty 4源代码。 eventLoop.inEventLoop() 随处可见。根据 Netty 的实际情况:

A Channel is registered for its lifetime with a single EventLoop. A single EventLoop may be assigned to one or more Channels. a channel has and only has one eventLoop/thread.

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

例如,以下代码转到 else block (NioSocketChannel$NioSocketChannelUnsafe(AbstractChannel$AbstractUnsafe).register(EventLoop, ChannelPromise)),其中 channel 未注册(分配给事件循环/线程) )。

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

最佳答案

这种代码确保只有正确的 eventLoop/线程才能处理/更改 Channel 对象。当只有一个特定线程可以使用 Channel 对象时,这解决了许多竞争条件和多线程问题。这与所谓的“线程安全”以及一个类是否被认为是“线程安全”有关。代码可解读如下:

if (amIOnTheCorrectThread()) {
doTheActualWork(); // I do the work
} else {
scheduleOnTheCorrectThread.performAction({ doTheActualWork(); }); // let him do the work
}

根据您是否位于正确的线程上,工作是直接完成(在正确的线程上)还是任务被卸载到正确的线程,以便另一个线程完成工作。另一个线程通过无限循环并检查是否有任何新任务要执行来实现这一点。例如,检查 io.netty.channel.ThreadPerChannelEventLooprun() 方法类:

@Override
protected void run() {
for (;;) {
Runnable task = takeTask();
if (task != null) {
task.run();
// [...]
}
[...]

关于java - 什么情况下 eventloop.inEventLoop() == false ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59577360/

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