根据这篇文章: https://stackoverflow.com/questions/6666659/threading-implications-of-asynchronousbytechannel异步套接字通道的java实现并不能保证在单独的线程中调用完成处理程序。因此,如果您正在读取字节缓冲区,那么如何在wait()之后调用notify()?
class CH implements CompletionHandler<Integer,Integer>
{
public volatile int i = 0;
public void completed(Integer i, Integer o)
{
this.i = i;
synchronized(this)
{
this.notify();
}
}
public void failed(Throwable t, Integer o)
{
this.i = -5;
synchronized(this)
{
this.notify();
}
}
}
CH x = new CH();
synchronized (x) {
while (!(x.i == -1 || x.i == -5)) {
aschannel.read(bytebuffer, 5, TimeUnit.SECONDS, null, x);
x.wait();
if(x.i != -1 && x.i != -5){
bytebuffer.flip();
filechannel.write(bytebuffer.array,0,x.i);
bytebuffer.clear();
}
}
}
答案 0 :(得分:2)
您的程序可能有效,因为wait()
会释放监视器并允许执行回调。
然而,异步I / O的整个想法是让I / O交换发起者免于等待(因此保持线程)。如果你想等待,那么只需使用好的旧同步API。或者在没有CompletionHandler的情况下调用read,它返回Future
,并等待那个Future。