Переименование потоков в Java

Я работаю над проектом, который медленно становится все больше и больше, и количество активных потоков, используемых многими различными процессами, увеличивается. В последнее время я внимательно рассматриваю запущенные потоки в отладчике, и я заметил, что многие мои сторонние библиотеки дали очень плохие имена своим потокам - Timer-0, qtp0 и т. д. Я хочу, чтобы другие разработчики, незнакомые с плохо названными потоками, мгновенно узнали, что работает.

вместо того, чтобы писать патчи для библиотек, которые мы используем, кто-нибудь знает, как переименовать запущенные потоки? Или это вообще хорошая идея? Любые предложения будут оценены.

7 ответов


Если проблема в библиотеках с открытым исходным кодом, то лучшим решением является поставка патчей для этих продуктов для лучшего именования потоков. За исключением менеджера безопасности, вы можете переименовать любой поток, перечислив потоки (как упоминалось выше) и применяя произвольное имя к каждому, но это хрупкий способ именования потоков, которые не являются вашими. Если сторонняя библиотека изменяет свое имя, вам придется изменить свой код.

Я согласен с тем, что сторонние библиотеки с плохо названные потоки затрудняют понимание того, что происходит в вашем приложении. Но переименование потоков из сторонней библиотеки рискованно. Что произойдет, если их следующий выпуск изменит способ именования потоков? И как вы обрабатываете стороннюю библиотеку, которая вообще не пытается назвать потоки?

изменить: добавьте текст, который как-то исчез с конца


Да, вы можете изменить имя потока с помощью setName() метод.

Что касается того, является ли это хорошей идеей, нет уверенности, но полагаться на имя потока для чего-либо, кроме читаемого человеком описания, было бы очень плохим решением, и большинство библиотек этого не сделают. Таким образом, вряд ли что-то сломается, если вы переименуете их.


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

чем больше вы относитесь к java как к операционной системе, тем легче ею управлять. :)


Изменить Имя Потока Java

Thread.currentThread().setName("MyThread");

можно использовать Thread.enumerate() или Thread.getAllStackTraces() чтобы получить список запущенных потоков. Затем вы можете позвонить Thread.setName() на каждого.

Я не могу сказать вам, является ли это хорошей идеей или нет, но я, вероятно, склоняюсь к "нет". Чем больше кода Вы пишете, тем больше кода Вы должны поддерживать.


Это ставит вопрос о передовой практике в отношении соглашений об именах для потоков. Я не видел никакого руководства сообщества в этом отношении.


setName() можно использовать для изменения имени потока, но вы должны иметь какой-то способ определения того, что поток должен быть вызван.
getAllStackTraces() позволит программе пример трассировки стека и использовать имена классов/методов/имен файлов в качестве подсказки о том, что называть потоком.