0

次のテスト プログラムは、単純なバインド/受け入れを実行してから、チャネル グループをシャットダウンします。

プログラムが結果の ShutdownChannelGroupException を出力することを期待しますが、代わりに、完了ハンドラーを呼び出すことはなく、スレッド プールで例外をスローします。

誰かが何が起こっているのかを明らかにすることができますか? shutdownNow() には次の動作があると彼らが言うとき、私はドキュメントを誤解していますか?

コールバックがまだ「アクティブ」になっていないため、破棄されるだけですか?

public static void main(String[] args) throws java.io.IOException, InterruptedException {

    ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    AsynchronousChannelGroup group = AsynchronousChannelGroup.withThreadPool(service);
    AsynchronousServerSocketChannel acceptor = AsynchronousServerSocketChannel.open(group);
    acceptor.bind(new InetSocketAddress(50000));
    acceptor.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
        @Override
        public void completed(AsynchronousSocketChannel result, Object attachment) {

        }

        @Override
        public void failed(Throwable exc, Object attachment) {
            System.out.println("failed: " + exc.getMessage());
        }
    });
    System.out.println("Shutting down");
    group.shutdownNow();
    System.out.println("Awaiting termination");
    group.awaitTermination(60, TimeUnit.SECONDS);
    System.out.println("Sleeping");
    Thread.sleep(1000);

}
4

2 に答える 2

0

私もこの動作を見たことがありますが、Windows でのみ、同じコードで Centos/Ubuntu で問題は発生しませんでした。あなたの仮定は正しいと思います.IOCP処理の何かがshutdownNow()中にきれいに終了していません。1 つ以上の接続が有効な場合、shutdownNow() は正常に完了することがわかりました。もちろん、これは JVM によって異なります。

このようなものがうまくいきました(接続を開き、閉じないでください):

idle = AsynchronousSocketChannel.open(group);
Future<Void> fut = idle.connect(new InetSocketAddress("localhost",50000));
fut.get();

これは間違いなくハックですが、迷惑な例外を無視して、実際の例外に集中できるようにするのに役立つ場合があります。

于 2013-03-18T03:00:42.963 に答える
0

「アクティブに実行中の完了ハンドラー」とは、「完了」または「失敗」したメソッドを実行しているハンドラーを意味します。

次に、 AsynchronousServerSocketChannel.accept() のドキュメントは次のようになります。

「グループがシャットダウンされ、接続が受け入れられた後、接続が閉じられ、操作は IOException で完了します」。

したがって、接続が受け入れられない場合、反応は想定されていません。あなたと同じように、グループがシャットダウンされたときに、まだ受け入れられていない接続ハンドラーが「failed()」を呼び出す必要があると思いますが、現在の実装の背後にあるすべての考慮事項はわかっていません。

于 2012-12-29T16:33:29.503 に答える