@java.lang.Override
    protected final void work() {

        if (log.isTraceEnabled()) {
            log.trace("START");
        }

        try {
            // セレクターの確認
            final int r = serverSelector.select(serverTimeout);
            if (r <= 0) {
                return;
            }
        } catch (IOException e) {
            // selectでIOExceptionが発生しました 処理は続行します
            log.error("Selector.select error", e);
            return;
        } catch (RuntimeException e) {
            // 例外を投げる事で呼び出される
            // ListenerUncaughtExceptionHandlerでサーバを落とす
            // サーバソケットで異常が発生しました.
            log.error("Selector.select error", e);
            throw e;
        }

        // キーリスト取得
        final Set<SelectionKey> selectedKeys = serverSelector.selectedKeys();
        for (final SelectionKey selectionKey : selectedKeys) {
            // キーの削除
            selectedKeys.remove(selectionKey);

            // 無いと思うが判断する
            if (!selectionKey.isAcceptable()) {
                continue;
            }

            // KEYからチャネルを取得する
            final SelectableChannel selectableChannel = selectionKey.channel();
            final ServerSocketChannel serverSocketChannel = ServerSocketChannel.class.cast(selectableChannel);

            SocketChannel socketChannel = null;

            try {
                socketChannel = serverSocketChannel.accept();
            } catch (IOException e) {
                // acceptでIOExceptionが発生しました 処理は続行します
                log.error("SocketChannel.accept error", e);

                return;
            } catch (RuntimeException e) {
                // 例外を投げる事で呼び出される
                // ListenerUncaughtExceptionHandlerでサーバを落とす
                // サーバソケットで異常が発生しました.
                log.error("SocketChannel.accept error", e);
                throw e;
            }

            if (socketChannel == null) {
                continue;
            }

            // 呼び出しているメソッドでの例外は無い ノンブロックの場合はスレッドの中で何とかしてください
            final AbstractListenerCommand command = createListenerCommand(socketChannel.socket());
            command.setExecutes(executes); // 実行中スレッド管理プール

            // RejectedExecutionException はHandlerが在るので発生しない
            // シャットダウン中の接続はRejectedExecutionHandlerでクローズされる
            threadPoolExecutor.execute(command);
        }
    }