0

根据这篇文章:https ://stackoverflow.com/questions/6666659/threading-impplications-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();
                               }
               }     


              }
4

1 回答 1

2

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

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

于 2012-11-13T08:33:59.867 回答