Тут, здається, всі думають, що реалізація Runnable - це шлях, і я не дуже з ними погоджуюся, але, на мій погляд, також є випадок для розширення теми, адже ви це продемонстрували у своєму коді.
Якщо ви реалізуєте Runnable, то клас, який реалізує Runnable, не контролює ім'я потоку, саме ім'я потоку може встановити ім'я потоку, наприклад:
new Thread(myRunnable,"WhateverNameiFeelLike");
але якщо ви розширите Thread, ви отримаєте можливість керувати цим у самому класі (так само, як у вашому прикладі ви називаєте нитку "ThreadB"). У цьому випадку ви:
A) може дати йому більш корисну назву для цілей налагодження
B) змушують використовувати це ім'я для всіх примірників цього класу (якщо ви не ігноруєте той факт, що це потік, і виконайте вищезгадане з ним так, ніби це Runnable, але ми говоримо про умовність тут, у будь-якому випадку може ігноруйте таку можливість, яку я відчуваю).
Можна навіть, наприклад, взяти слід стека його створення і використовувати це як ім’я потоку. Це може здатися дивним, але залежно від структури вашого коду він може бути дуже корисним для налагодження.
Це може здатися дрібницею, але там, де у вас дуже складний додаток з великою кількістю потоків, і раптом все "зупинилося" (або з причини тупика, або, можливо, через недолік мережевого протоколу, який був би меншим Очевидно - або з інших нескінченних причин), то отримання дампів стека з Java, де всі потоки називаються "Thread-1", "Thread-2", "Thread-3" - це не завжди дуже корисно (це залежить від того, якими є ваші теми структурований і чи можете ви корисно сказати, що саме за їх слідом стека - це не завжди можливо, якщо ви використовуєте групи з декількох потоків, які мають один і той же код).
Сказавши, що ви, звичайно, також можете зробити вищезазначене узагальненим чином, створивши розширення класу потоків, який встановлює його ім'я сліду стека його виклику створення, а потім використовувати це зі своїми реалізаціями Runnable замість стандартного класу java Thread (див. нижче), але на додаток до сліду стека може бути більше контекстної інформації, яка була б корисною в імені потоку для налагодження (посилання на одну з багатьох черг або сокетів, яку вона може обробити, наприклад, у якому випадку ви хочете скористатися розширіть тему спеціально для цього випадку, щоб ви могли змусити компілятор змусити вас (або інших, хто використовує ваші бібліотеки) передати певну інформацію (наприклад, черга / сокет, про який йде мова) для використання в імені).
Ось приклад загальної нитки, яка має назву стека виклику:
public class DebuggableThread extends Thread {
private static String getStackTrace(String name) {
Throwable t= new Throwable("DebuggableThread-"+name);
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
t.printStackTrace(ps);
return os.toString();
}
public DebuggableThread(String name) {
super(getStackTrace(name));
}
public static void main(String[] args) throws Exception {
System.out.println(new Thread());
System.out.println(new DebuggableThread("MainTest"));
}
}
і ось зразок виводу з порівнянням двох імен:
Thread[Thread-1,5,main]
Thread[java.lang.Throwable: DebuggableThread-MainTest
at DebuggableThread.getStackTrace(DebuggableThread.java:6)
at DebuggableThread.<init>(DebuggableThread.java:14)
at DebuggableThread.main(DebuggableThread.java:19)
,5,main]