0

この投稿によると: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();
                               }
               }     


              }
4

1 に答える 1

2

wait()モニターを解放し、コールバックの実行を許可するため、プログラムが機能する可能性があります。

ただし、非同期I / Oの全体的な考え方は、I / O交換イニシエーターを待機から解放することです(したがって、スレッドを保持します)。とにかく待ちたい場合は、古き良き同期APIを使用してください。または、を返すCompletionHandlerなしでreadを呼び出しFuture、そのFutureを待ちます。

于 2012-11-13T08:33:59.867 に答える