Netty 的 `sync` 与 `syncUninterruptibly`

Posted

技术标签:

【中文标题】Netty 的 `sync` 与 `syncUninterruptibly`【英文标题】:Netty's `sync` vs `syncUninterruptibly` 【发布时间】:2015-11-02 15:43:57 【问题描述】:

我试图从 Netty 的文档中找出答案,并在 Google 上搜索了一下,但我找不到任何关于 ChannelFuturesync()syncUninterruptibly() 方法之间的区别(除了 @ 987654324@ 明确抛出 InterruptedExceptionsyncUninterruptibly 没有)。任何人都可以对这个主题有所了解吗?

我会说使用syncUninterruptibly 会更“愉快”(至少对我而言),因为它没有声明任何已检查的异常。如果这是唯一的区别,那为什么两种方法都在那里?

【问题讨论】:

【参考方案1】:

您可以查看await()awaitUninterruptibly() 以了解差异。

    第一种,如果执行future相关操作的线程发生中断,由于当前执行sync(或await)的线程不同,会在调用者中抛出异常,如你知道的。

    if (Thread.interrupted()) 
        throw new InterruptedException(toString());
    
    

    在第二种情况下,如果在执行future相关操作的线程中发生了中断,它只会在调用者线程上重做一个中断,这意味着你对中断进行不同的管理。

    if (interrupted) 
        Thread.currentThread().interrupt();
    
    

因此,您可以将第一个视为加速器,以确保您测试中断。但有时您可能更愿意将此中断处理再次推迟到另一个调用者,您可能更喜欢第二个。

所以用法与你想如何处理线程中断有关。

【讨论】:

以上是关于Netty 的 `sync` 与 `syncUninterruptibly`的主要内容,如果未能解决你的问题,请参考以下文章

Netty是个啥?简单来说就这!

以编程方式关闭 netty

Netty网络编程实战3,使用Netty远程传输文件

关于Netty启动的一个疑问

Netty 通过一个渠道写几条消息

Netty源码分析之NioEventLoop执行流程