java异步套接字通道/完成处理程序

时间:2012-11-13 06:54:53

标签: java nio

根据这篇文章: 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();
                               }
               }     


              }

1 个答案:

答案 0 :(得分:2)

您的程序可能有效,因为wait()会释放监视器并允许执行回调。

然而,异步I / O的整个想法是让I / O交换发起者免于等待(因此保持线程)。如果你想等待,那么只需使用好的旧同步API。或者在没有CompletionHandler的情况下调用read,它返回Future,并等待那个Future。