Netty Channel.close()线程安全吗?

时间:2016-04-25 09:52:09

标签: thread-safety netty

我有一个Netty服务器,我需要在另一个线程中关闭请求Channel。这样做线程安全吗?如果没有,是否可以采取一些解决方法来解决它?任何建议表示赞赏!

BTW,我正在使用netty-4.0.34和NioEventLoopGroup。

AbstractChannelHandlerContext.java:514

    @Override
    public ChannelFuture close(final ChannelPromise promise) {
    if (!validatePromise(promise, false)) {
        // cancelled
        return promise;
    }

    final AbstractChannelHandlerContext next = findContextOutbound();
    EventExecutor executor = next.executor();
    if (next.isHandlerAddedCalled() && executor.inEventLoop()) {
        next.invokeClose(promise);
    } else {
        safeExecute(executor, new OneTimeTask() {
            @Override
            public void run() {
                next.invokeClose(promise);
            }
        }, promise, null);
    }

    return promise;
}

如果在另一个线程中调用,那么通道所坚持的IO线程最终将完成闭包,因为'executor.inEventLoop()'将始终为false。这种解释是真的吗?

1 个答案:

答案 0 :(得分:0)

它是线程安全的,但如果请求在飞行中,您可能会在管道和客户端触发异常。