Как дать имя вызываемому Потоку? [дубликат]

Этот вопрос уже имеет ответ здесь:

Я выполняю Вызываемое использование Объекта пул потоков ExecutorService. Я хочу дать имя этому потоку.

Чтобы быть точнее, в более старой версии я сделал это -

Thread thread = new Thread(runnable Task);
thread.setName("My Thread Name");

Я использую имя потока во входе log4j, это помогает много при поиске и устранении неисправностей. Теперь я перемещаю свой код от Java 1.4 до Java 1.6. Я записал это (Данный ниже) - но я не знаю, как дать имя этому потоку.

private final ExecutorService executorPool = Executors.newCachedThreadPool();
Future result = executorPool.submit(callable Task);

Дайте мне некоторое представление для давания имени этому потоку?

35
задан Ravindra babu 19 June 2016 в 03:47
поделиться

2 ответа

Можно использовать перегруженный метод:

java.util.concurrent.Executors.newCachedThreadPool(ThreadFactory)

который позволяет передавать

java.util.concurrent.ThreadFactory

имя потока через java.util.concurrent.ThreadFactory.newThread(Runnable):

Конструирует новый Thread. Реализации могут также инициализировать приоритет, имя, статус демона, ThreadGroup и т.д.

Посмотрите java.util.concurrent.Executors.DefaultThreadFactory для реализации по умолчанию.

Дополнение

Поскольку я вижу, что эта тема все еще посещается, Guava (если она у вас есть) предоставляет ThreadFactoryBuilder, который использует необходимость иметь внутренний анонимный класс и даже позволяет настраивать параметризованные имена для ваших потоков.

29
ответ дан 27 November 2019 в 06:38
поделиться

Вы должны быть осторожны при переименовании потоков, когда ваши потоки управляются пулом потоков, потому что они фактически используются снова и снова для различных задач, и после переименования вы можете обнаружить, что имена потоков в ваших журналах не имеют никакого смысла... Чтобы избежать такого нежелательного поведения, вы должны убедиться, что после завершения работы вашего Runnable/Callable имя потока будет восстановлено.

Один из способов реализовать это - обернуть каждую Runnable/Callable, выполняемую пулом потоков, декоратором, который обрабатывает все необходимые очистки.

8
ответ дан 27 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: