Netty的`sync` vs`syncUninterruptibly`

时间:2015-08-10 16:15:56

标签: netty channel

我试图从Netty的文档和Google搜索中找出一点,但我找不到struct X { int id; int subid; }; struct Details {}; struct Comparator { using is_transparent = std::true_type; // standard comparison (between two instances of X) bool operator()(const X& lhs, const X& rhs) const { return lhs.id < rhs.id; } // comparison via id (compares X with integer) bool operator()(const X& lhs, int rhs) const { return lhs.id < rhs; } bool operator()(int lhs, const X& rhs) const { return lhs < rhs.id; } // Same thing with Y bool operator()(const X& lhs, const Y& rhs) const { return lhs.id < rhs.getId(); } bool operator()(const Y& lhs, const X& rhs) const { return lhs.getId() < rhs.id; } }; int main() { std::map<X, Details, Comparator> detailsMap = { { X{1, 2}, Details{} }, { X{3, 4}, Details{} }, { X{5, 6}, Details{} } }; // it1 and it2 point to the same element. auto it1 = detailsMap.find(X{1, 2}); auto it2 = detailsMap.find(1); std::cout << detailsMap.size() << std::endl; std::cout << std::boolalpha << (it1 == detailsMap.end()) << std::endl; // false std::cout << std::boolalpha << (it1 == it2) << std::endl; // true } 的{​​{1}}和ChannelFuture方法之间的区别(分开)明显的事实是sync()明确抛出syncUninterruptibly()sync却没有。任何人都可以对这个问题有所了解吗?

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

1 个答案:

答案 0 :(得分:2)

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

  1. 在第一个中,如果在执行未来相关操作的线程中抛出了中断,因为执行sync(或await)的当前线程不同,它将抛出调用者中的一个例外,你知道。

    if (Thread.interrupted()) {
        throw new InterruptedException(toString());
    }
    
  2. 在第二个中,如果在执行未来相关操作的线程中抛出了中断,它将只重做调用者线程的中断,这意味着您可以不同地管理中断。

    if (interrupted) {
        Thread.currentThread().interrupt();
    }
    
  3. 因此,您可以将第一个视为加速器,以确保您测试中断。但有时您可能更愿意将此中断处理再次推迟到另一个呼叫者,您可能更喜欢第二个。

    因此,用法与您希望如何处理线程中断有关。