@Override
  public <U> ParSeqBasedCompletionStage<U> thenApplyAsync(Function<? super T, ? extends U> fn, Executor executor)
  {
    return nextStageByComposingTask(_task.flatMap("thenApplyAsync", (t) -> Task.blocking(() -> fn.apply(t), executor)));
  }
@Test
  public void testThenApplyAsync() throws Exception
  {
    CompletionStage<String> completionStage = createTestStage(TESTVALUE1);

    CountDownLatch waitLatch = new CountDownLatch(1);

    completionStage.thenApplyAsync(r -> {
      assertEquals(THREAD_NAME_VALUE, Thread.currentThread().getName());
      waitLatch.countDown();
      return "";
    }, _mockExecutor);

    finish(completionStage);
    waitLatch.await(1000, TimeUnit.MILLISECONDS);
  }