Javadoc AsynchronousByteChannel.read()表示该操作异步发生,但是在达到流尾时发生了什么?是否允许在调用read()的同一线程中触发完成处理程序?从实现的角度来看,没有理由异步执行此操作,因为我们已经知道结果。同样,如果用户试图读入剩余()返回0的ByteBuffer,我们知道读取操作必须返回0.AsynchronousByteChannel的线程影响
我问,因为我在自己的AsynchronousByteChannel实现中遇到竞态条件。我正在调用完成处理程序,该操作程序在操作完成时调用notify()。然后,我引用下面的用户代码:
CompletionHandler<?, ?> handler = ...;
synchronized (handler)
{
asyncByteChannel.read(handler);
handler.wait();
}
注意用户是假设在操作完成时的处理程序将被通报,但由于阅读()实际上调用完成处理程序同步它被等待前通知()后者将永远封锁。
规范是否要求我在单独的线程中更新CompletionHandler,或者用户是否应该意识到调用read()的线程可以同步执行某些操作的事实?
它的线程模型是一团糟。异步组上的javadoc是不可解析的。线程应该留给开发人员 - 这很容易。不幸的是,他们决定帮助我们。结果非常复杂,不直观,没有记录(因为他们无法解释混乱)。一位偶然的评论者可能会发现API是正确的 - 实际上为什么它应该很难?但是当人们认真构建一个应用程序时,复杂性会让他变得疯狂。 – irreputable