heartbeat threads blocks process shutdown because its hashed-wheel-timer is non-daemon thread.
}
    private boolean isRunning() {
        Collection<Channel> channels = getChannels();
        for (Channel channel : channels) {
            /**
             *  If there are any client connections,
             *  our server should be running.
             */
            if (channel.isConnected()) {
                return true;
            }
        }
        return false;
    }
    @Override
    public void close() {
        doClose();
        server.close();
    }
    @Override
    public void close(final int timeout) {
        startClose();
        if (timeout > 0) {
            final long max = (long) timeout;
            final long start = System.currentTimeMillis();
            if (getUrl().getParameter(Constants.CHANNEL_SEND_READONLYEVENT_KEY, true)) {
                sendChannelReadOnlyEvent();
            }
            while (HeaderExchangeServer.this.isRunning()
                    && System.currentTimeMillis() - start < max) {