У меня есть фиксированный пул потоков, в который я отправляю задачи (ограничено 5 потоками). Как я могу узнать, какой из этих 5 потоков выполняет мою задачу (что-то вроде «поток № 3 из 5 выполняет эту задачу»)?
ExecutorService taskExecutor = Executors.newFixedThreadPool(5);
//in infinite loop:
taskExecutor.execute(new MyTask());
....
private class MyTask implements Runnable {
public void run() {
logger.debug("Thread # XXX is doing this task");//how to get thread id?
}
}
% numThreads
вместо этого следует использоватьgetId()
есть14291
где , какgetName()
дает вамpool-29-thread-7
, что я бы поспорил более полезным.Принятая ответ отвечает на вопрос о получении на идентификатор потока, но это не позволяет делать «Thread X из Y» сообщений. Идентификаторы потоков уникальны для разных потоков, но не обязательно начинаются с 0 или 1.
Вот пример, соответствующий вопросу:
и вывод:
Небольшая настройка с использованием арифметики по модулю позволит вам правильно выполнить «поток X из Y»:
Новые результаты:
источник
Вы можете использовать Thread.getCurrentThread.getId (), но зачем вам это нужно, когда объекты LogRecord, управляемые регистратором, уже имеют идентификатор потока. Я думаю, вам где-то не хватает конфигурации, которая регистрирует идентификаторы потоков для ваших сообщений журнала.
источник
Если ваш класс наследуется от Thread , вы можете использовать методы
getName
иsetName
дать имя каждому потоку. В противном случае вы можете просто добавитьname
полеMyTask
и инициализировать его в своем конструкторе.источник
Если вы используете ведение журнала, вам будут полезны имена потоков. Фабрика потоков помогает в этом:
Вывод:
источник
Есть способ получения текущего потока:
После того, как у вас есть объект класса Thread (t), вы можете получить необходимую информацию с помощью методов класса Thread.
Получение идентификатора потока:
Получение имени потока:
источник