@Override
  public <U, V> ParSeqBasedCompletionStage<V> thenCombineAsync(CompletionStage<? extends U> other,
      BiFunction<? super T, ? super U, ? extends V> fn, Executor executor)
  {
    Task<U> that = getOrGenerateTaskFromStage(other);
    return nextStageByComposingTask(
        Task.par(_task, that).flatMap("thenCombineAsync", (t, u) -> Task.blocking(() -> fn.apply(t, u), executor)));
  }
@Test
  public void testThenCombineAsync() throws Exception
  {
    CountDownLatch waitLatch = new CountDownLatch(1);
    CompletionStage<String> completionStage1 = createTestStage(TESTVALUE1);
    CompletionStage<String> completionStage2 = createTestStage(TESTVALUE2);
    finish(completionStage1.thenCombineAsync(completionStage2, (a, b) ->  {
        assertEquals(THREAD_NAME_VALUE, Thread.currentThread().getName());
      waitLatch.countDown();
        return 0;
    }, _mockExecutor));
    assertTrue(waitLatch.await(1000, TimeUnit.MILLISECONDS));
  }