@Override
        public void run2() {
          if (isSocketClosed()) {
            // Connection is closing - nothing to do anymore
            cancel();
            return;
          }
          if (owner.isClosed()) {
            cancel();
            return;
          }
          byte connState;
          synchronized (stateLock) {
            connState = connectionState;
          }
          boolean sentAlert = false;
          synchronized (Connection.this) {
            if (socketInUse) {
              switch (connState) {
                case Connection.STATE_IDLE:
                case Connection.STATE_POST_SENDING:
                case Connection.STATE_RECEIVED_ACK:
                  break;
                case Connection.STATE_SENDING:
                case Connection.STATE_READING_ACK:
                  sentAlert = doSevereAlertProcessing();
                  break;
                default:
              }
            }
          }
          List<Connection> group = ackConnectionGroup;
          if (sentAlert && group != null) {
            // since transmission and ack-receipt are performed serially, we don't want to complain
            // about all receivers out just because one was slow. We therefore reset the time stamps
            // and give others more time
            for (Connection connection : group) {
              if (connection != Connection.this) {
                connection.transmissionStartTime += connection.ackSATimeout;
              }
            }
          }
        }
ensure that a task is running to monitor transmission and reading of acks
geode-core/src/main/java/org/apache/geode/internal/tcp/Connection.java