Переименование потоков в Java
Я работаю над проектом, который медленно становится все больше и больше, и количество активных потоков, используемых многими различными процессами, увеличивается. В последнее время я внимательно рассматриваю запущенные потоки в отладчике, и я заметил, что многие мои сторонние библиотеки дали очень плохие имена своим потокам - Timer-0, qtp0 и т. д. Я хочу, чтобы другие разработчики, незнакомые с плохо названными потоками, мгновенно узнали, что работает.
вместо того, чтобы писать патчи для библиотек, которые мы используем, кто-нибудь знает, как переименовать запущенные потоки? Или это вообще хорошая идея? Любые предложения будут оценены.
7 ответов
Если проблема в библиотеках с открытым исходным кодом, то лучшим решением является поставка патчей для этих продуктов для лучшего именования потоков. За исключением менеджера безопасности, вы можете переименовать любой поток, перечислив потоки (как упоминалось выше) и применяя произвольное имя к каждому, но это хрупкий способ именования потоков, которые не являются вашими. Если сторонняя библиотека изменяет свое имя, вам придется изменить свой код.
Я согласен с тем, что сторонние библиотеки с плохо названные потоки затрудняют понимание того, что происходит в вашем приложении. Но переименование потоков из сторонней библиотеки рискованно. Что произойдет, если их следующий выпуск изменит способ именования потоков? И как вы обрабатываете стороннюю библиотеку, которая вообще не пытается назвать потоки?
изменить: добавьте текст, который как-то исчез с конца
Да, вы можете изменить имя потока с помощью setName() метод.
Что касается того, является ли это хорошей идеей, нет уверенности, но полагаться на имя потока для чего-либо, кроме читаемого человеком описания, было бы очень плохим решением, и большинство библиотек этого не сделают. Таким образом, вряд ли что-то сломается, если вы переименуете их.
Я называю все потоки, которые я создаю. У меня было слишком много приложений утечка потоков, или потоков, в противном случае выйти из-под контроля.
чем больше вы относитесь к java как к операционной системе, тем легче ею управлять. :)
можно использовать Thread.enumerate()
или Thread.getAllStackTraces()
чтобы получить список запущенных потоков. Затем вы можете позвонить Thread.setName()
на каждого.
Я не могу сказать вам, является ли это хорошей идеей или нет, но я, вероятно, склоняюсь к "нет". Чем больше кода Вы пишете, тем больше кода Вы должны поддерживать.
Это ставит вопрос о передовой практике в отношении соглашений об именах для потоков. Я не видел никакого руководства сообщества в этом отношении.
setName()
можно использовать для изменения имени потока, но вы должны иметь какой-то способ определения того, что поток должен быть вызван.getAllStackTraces()
позволит программе пример трассировки стека и использовать имена классов/методов/имен файлов в качестве подсказки о том, что называть потоком.