code: public Runnable concat(Runnable... runnables)
      {
          if (runnables.length == 0)
          {
              throw new IllegalArgumentException("empty");
          }
          Runnable r = runnables[runnables.length-1];
          for (int ii=runnables.length-2;ii>=0;ii--)
          {
              r = concat(runnables[ii], r);
          }
          return r;
      }
docs: Concatenates tasks to one task. After first tasks run is completed,
  next start is submitted and so on, until all tasks are run or exception
  is thrown.
  run is completed.
  @param runnables
  @return