内容目录
4.4异步关闭能力
任何时候都有可能关闭一个通道或者取消一个选择键。除非您采取步骤进行同步,否则键的状态及相关的通道将发生意料之外的改变。一个特定的键的集合中的一个键的存在并不保证键仍然是有效的,或者它相关的通道仍然是打开的。
关闭通道的过程不应该是一个耗时的操作。NIO的设计者们特别想要阻止这样的可能性:一个线程在关闭一个处于选择操作中的通道时,被阻塞于无限期的等待。当一个通道关闭时,它相关的键也就都被取消了。这并不会影响正在进行的select()
,但这意味着在您调用select()
之前仍然是有效的键,在返回时可能会变为无效。您总是可以使用由选择器的selectKeys()
方法返回的已选择的键的集合:请不要自己维护键的集合。理解3.4.5小节描述的选择过程,对于避免遇到问题而言是非常重要的。
您可以参考4.3.2小节,以详细了解一个在select()
中阻塞的线程是如何被唤醒的。
如果您试图使用一个已经失效的键,大多数方法将抛出CancelledKeyException
。但是,您可以安全地从从已取消的键中获取通道的句柄。如果通道已经关闭时,仍然试图使用它的话,在大多数情况下将引发ClosedChannelException
。
0 条评论
撰写评论