метод.

исал следующий код:

 System.out.println("Main thread:" + Thread.currentThread().getId());
 CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
     try {
         System.out.println("Before sleep thread:" + Thread.currentThread().getId(), + " isDaemon:" + Thread.currentThread().isDaemon());
          Thread.sleep(100);
          System.out.println("After sleep");
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
  });
  future.whenComplete((r, e) -> System.out.println("whenCompleted thread:" + Thread.currentThread().getId()));

и этот печатает:

Main thread:1
Before sleep thread:11 isDaemon:true

и заканчивает.

Как я могу изменить это поведение?

Постскриптум Я не вижу ничего связанного вrunAsync Java документ

 gstackoverflow04 сент. 2017 г., 10:24
@GhostCat, я только что писал тест, и это поведение меня удивило
 gstackoverflow04 сент. 2017 г., 11:14
@GhostCat спасибо за информацию)

Ответы на вопрос(2)

ForkJoinPool.commonPool().awaitTermination(5, TimeUnit.SECONDS);

к основному методу после запуска вашего будущего. Я буду блокировать, пока все задачи в пуле не будут выполнены.

Блокируется до тех пор, пока все задачи не завершат выполнение после запроса на выключение, или не истечет время ожидания, или текущий поток не будет прерван, в зависимости от того, что произойдет раньше.

 gstackoverflow04 сент. 2017 г., 11:37
после или до?
 Lukasz Wiktor04 сент. 2017 г., 11:39
После. Я поместил это в последнюю строкуmain метод.
Решение Вопроса

Javadoc заrunAsync() говорит:

Возвращает новое CompletableFuture, которое асинхронно завершается задачей, выполняемой в ForkJoinPool.commonPool () после запуска данного действия.

Естьеще один версияrunAsync() где ты можешьпроходят ExecutorService.

Таким образом: когда по умолчаниюcommonPool () не делать то, что вы хотите, - вместо этого создайте свой собственный ExecutorService.

Ваш ответ на вопрос