我试图从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
更加“愉快”(至少对我而言),因为它没有声明任何已检查的异常。如果这是唯一的区别,那么为什么两种方法都存在呢?
答案 0 :(得分:2)
您可以查看await()
和awaitUninterruptibly()
以查看差异。
在第一个中,如果在执行未来相关操作的线程中抛出了中断,因为执行sync
(或await
)的当前线程不同,它将抛出调用者中的一个例外,你知道。
if (Thread.interrupted()) {
throw new InterruptedException(toString());
}
在第二个中,如果在执行未来相关操作的线程中抛出了中断,它将只重做调用者线程的中断,这意味着您可以不同地管理中断。
if (interrupted) {
Thread.currentThread().interrupt();
}
因此,您可以将第一个视为加速器,以确保您测试中断。但有时您可能更愿意将此中断处理再次推迟到另一个呼叫者,您可能更喜欢第二个。
因此,用法与您希望如何处理线程中断有关。