Executors.newWorkStealingPool(1);
использует ForkJoinPool
, у которого есть недокументированная функция, называемая компенсационными потоками.
От http://www.coopsoft.com/ar/CalamityArticle.html (акцент мой):
В JDK1.8 представлен класс CompletableFuture. Процитируем JavaDoc:
«Будущее, которое может быть явно завершено (с указанием его значения и статуса) и может включать в себя зависимые функции и действия, которые срабатывают после его завершения».
В JavaDoc не упоминается, что при использовании большого количества зависимых функций с методом get () платформа создает «потоки компенсации» для продолжения извлечения задач приложения из очереди запросов и отправки.
Поэтому, когда вы делаете future.get();
, он блокируется, но создается другой поток, в котором выполняется задача.
Когда я запускаю ваш код, я получаю вывод:
func: ForkJoinPool-1-worker-1
главная: главная
заглушка: ForkJoinPool-1- worker-0
принять: ForkJoinPool-1-worker-1
Вы не показали свой метод threadName()
, возможно, в нем есть ошибка, и из-за этого вы видите одно и то же имя потока (или вы используете другую JVM, которая в этом случае использует одно и то же имя, проверьте поток Я БЫ)? Если нет, предоставьте полный код, который выводит func и stub в виде одних и тех же потоков.