code: public NettyServerBuilder bossEventLoopGroup(EventLoopGroup group) {
      if (group != null) {
        return bossEventLoopGroupPool(new FixedObjectPool<>(group));
      }
      return bossEventLoopGroupPool(DEFAULT_BOSS_EVENT_LOOP_GROUP_POOL);
    }
docs: Provides the boss EventGroupLoop to the server.
  
  <p>It's an optional parameter. If the user has not provided one when the server is built, the
  builder will use the default one which is static.
  
  <p>You must also provide corresponding {@link io.netty.channel.Channel} type using {@link
  #channelType(Class)} and {@link #workerEventLoopGroup(EventLoopGroup)}. For example, {@link
  NioServerSocketChannel} must use {@link io.netty.channel.nio.NioEventLoopGroup} for both boss
  and worker {@link EventLoopGroup}, otherwise your server won't start.
  
  <p>The server won't take ownership of the given EventLoopGroup. It's caller's responsibility
  to shut it down when it's desired.
  
  <p>Grpc uses non-daemon {@link Thread}s by default and thus a {@link io.grpc.Server} will
  continue to run even after the main thread has terminated. However, users have to be cautious
  when providing their own {@link EventLoopGroup}s.
  For example, Netty's {@link EventLoopGroup}s use daemon threads by default
  and thus an application with only daemon threads running besides the main thread will exit as
  soon as the main thread completes.
  A simple solution to this problem is to call {@link io.grpc.Server#awaitTermination()} to
  keep the main thread alive until the server has terminated.