Java: Thread.currentThread().getName() возвращает "NO_THREAD_YET"

У меня есть веб-служба, которая запускает пул потоков при запуске службы следующим образом:

ExecutorService threadPool = Executors.newFixedThreadPool(30);
threadPool.execute(new WorkerThread());

Класс Workthread выглядит следующим образом:

    class WorkerThread implements Runnable {

    public WorkerThread () {
    }

    @Override
    public void run() {
        String threadName = Thread.currentThread().getName()
    }
}

Проблема: иногда имя потока NO_THREAD_YET, и я не могу понять, при каких обстоятельствах это происходит. Я думаю, что у ExecutorService просто нет доступных бесплатных угроз, но почему пул не выдает Exception, когда он полон, и я пытаюсь добавить новый WorkerThread?

Как я могу убедиться, что Thread.currentThread().getName() всегда возвращает идентификатор допустимого потока из пула?

Обновлено: класс WorkerThread - это моя собственная реализация. Это всего лишь сокращенный пример кода, так как другие аргументы я передаю WorkerThread, например. String переменные не связаны с этой проблемой.

из какого класса WorkerThread? JDK не содержит таких

Alex Salauyou 27.05.2019 14:31

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

Hovercraft Full Of Eels 27.05.2019 14:32

WorkerThread — это пользовательский класс @AlexSalauyou.

Srinivasan Sekar 27.05.2019 14:33
DefaultThreadFactory, используемый для создания потоков в Executors, создает потоки с именами типа «pool-X-thread-Y», если вы не используете пользовательскую фабрику или не меняете имя вручную. Это должно быть .setName("NO_THREAD_YET") где-то в вашем коде. Как сказал @HovercraftFullOfEels, Runnable не будет работать, пока какой-либо поток не станет доступным.
Alex Salauyou 27.05.2019 14:36

Моя формулировка была неверна, поскольку должно быть так, что «рабочий поток не могу будет работать до тех пор, пока у службы не появится доступный для него поток».

Hovercraft Full Of Eels 27.05.2019 14:41

И, вопреки вашему мнению, исполнитель по умолчанию не будет генерировать исключение, если пул занят, просто молча ставит задачу в очередь.

Alex Salauyou 27.05.2019 14:41

Почему вы удалили этот вопрос?

Hovercraft Full Of Eels 27.05.2019 16:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
472
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Скорее всего, причина в том, что вы переименовываете поток вручную где-то в своем коде, например. во время какой-либо другой задачи, которая выполняется в том же пуле потоков:

@Override
public void run() {
    // ...
    Thread.currentThread().setName("NO_THREAD_YET");
    // ...
}

после того, как эта задача завершена, поток «возвращается» в пул, становясь доступным для других задач, и, когда в конечном итоге запрашивается, создается такой вывод.

Чтобы получить неизменяемый идентификатор потока, используйте Thread#getId

Не знаю, почему ОП решил удалить вопрос, поскольку ваш ответ правильный. Я помог отменить удаление. 1+

Hovercraft Full Of Eels 27.05.2019 16:05

Хорошо, я узнал, что приложение не переименовывало саму угрозу, как вы сказали, но произошло нечто еще более странное. Имя потока было записано в базу данных с суффиксом "NO_THREAD_YET". Я даже не понял, почему это было реализовано, но я удалил суффикс, и теперь он работает.

flixe 11.06.2019 11:41

Другие вопросы по теме