code: @Override
      public ForkChannel connect(String cluster_name) throws Exception {
          if(!this.main_channel.isConnected())
              throw new IllegalStateException("main channel is not connected");
          if(state == State.CONNECTED)
              return this;
          if(state == State.CLOSED)
              throw new IllegalStateException("a closed fork channel cannot reconnect");
  
          state=State.CONNECTING;
          this.main_channel.addChannelListener(this);
          copyFields();
          JChannel existing_ch=((ForkProtocolStack)prot_stack).putIfAbsent(fork_channel_id,this);
          if(existing_ch != null && existing_ch != this)
              throw new IllegalArgumentException("fork-channel with id=" + fork_channel_id + " is already present");
          setLocalAddress(local_addr);
  
          prot_stack.startStack();
  
          prot_stack.down(new Event(Event.CONNECT, cluster_name));
  
          View current_view=main_channel.getView();
          if(current_view != null) {
              up(new Event(Event.VIEW_CHANGE, current_view));
              prot_stack.down(new Event(Event.VIEW_CHANGE, current_view));
          }
          state=State.CONNECTED;
          notifyChannelConnected(this);
          return this;
      }
docs: Connects the fork-channel, which will be operational after this. Note that the fork-channel will
  have the same state as the main-channel, ie. if the main-channel is disconnected, so will the fork-channel be,
  even if connect() was called. This connect() method essentially adds the fork-channel to the fork-stack's hashmap,
  ready to send/receive messages as soon as the main-channel has been connected.<p/>
  This method does <em>not</em> affect the main-channel.
  @param cluster_name Ignored, will be the same as the main-channel's cluster name
  @throws Exception