code: @Override
      protected final Set<SocketAddress> bindInternal(
              List<? extends SocketAddress> localAddresses) throws Exception {
          // Create a bind request as a Future operation. When the selector
          // have handled the registration, it will signal this future.
          AcceptorOperationFuture request = new AcceptorOperationFuture(
                  localAddresses);
  
          // adds the Registration request to the queue for the Workers
          // to handle
          registerQueue.add(request);
  
          // creates the Acceptor instance and has the local
          // executor kick it off.
          startupAcceptor();
          
          // As we just started the acceptor, we have to unblock the select()
          // in order to process the bind request we just have added to the 
          // registerQueue.
          wakeup();
          
          // Now, we wait until this request is completed.
          request.awaitUninterruptibly();
  
          if (request.getException() != null) {
              throw request.getException();
          }
  
          // Update the local addresses.
          // setLocalAddresses() shouldn't be called from the worker thread
          // because of deadlock.
          Set<SocketAddress> newLocalAddresses = new HashSet<>();
          
          for (H handle:boundHandles.values()) {
              newLocalAddresses.add(localAddress(handle));
          }
  
          return newLocalAddresses;
      }
docs: {@inheritDoc}