Этот вопрос уже имеет ответ здесь:
Я выполняю Вызываемое использование Объекта пул потоков 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);
Дайте мне некоторое представление для давания имени этому потоку?
Можно использовать перегруженный метод:
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, который использует необходимость иметь внутренний анонимный класс и даже позволяет настраивать параметризованные имена для ваших потоков.
Вы должны быть осторожны при переименовании потоков, когда ваши потоки управляются пулом потоков, потому что они фактически используются снова и снова для различных задач, и после переименования вы можете обнаружить, что имена потоков в ваших журналах не имеют никакого смысла... Чтобы избежать такого нежелательного поведения, вы должны убедиться, что после завершения работы вашего Runnable/Callable имя потока будет восстановлено.
Один из способов реализовать это - обернуть каждую Runnable/Callable, выполняемую пулом потоков, декоратором, который обрабатывает все необходимые очистки.