Java: Thread.currentThread (). GetName () возвращает «NO_THREAD_YET» - PullRequest
0 голосов
/ 27 мая 2019

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

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

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

    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 переменные, не связаны с этой проблемой.

1 Ответ

2 голосов
/ 27 мая 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...