Wydaje się, że wszyscy tutaj myślą, że wdrożenie Runnable jest właściwą drogą i tak naprawdę nie zgadzam się z nimi, ale moim zdaniem istnieje również możliwość rozszerzenia Thread, w rzeczywistości wykazaliście to w swoim kodzie.
Jeśli implementujesz Runnable, klasa, która implementuje Runnable, nie ma kontroli nad nazwą wątku, to kod wywołujący może ustawić nazwę wątku, tak jak:
new Thread(myRunnable,"WhateverNameiFeelLike");
ale jeśli rozszerzysz wątek, możesz zarządzać tym w samej klasie (tak jak w twoim przykładzie nazywasz wątek „ThreadB”). W takim przypadku:
A) może nadać mu bardziej przydatną nazwę do celów debugowania
B) wymuszają używanie tej nazwy we wszystkich instancjach tej klasy (chyba że zignorujesz fakt, że jest to wątek i zrobisz to z nim tak, jakby to był Runnable, ale mówimy tutaj o konwencji, więc w każdym razie zignoruj tę możliwość, którą czuję).
Możesz nawet na przykład pobrać ślad stosu jego utworzenia i użyć go jako nazwy wątku. Może się to wydawać dziwne, ale w zależności od struktury kodu może być bardzo przydatne do celów debugowania.
Może się to wydawać małą rzeczą, ale w przypadku bardzo złożonej aplikacji z dużą liczbą wątków i nagle wszystko „zatrzymało się” (albo z powodu impasu, albo być może z powodu wady protokołu sieciowego, który byłby mniejszy oczywiste - lub z innych niekończących się powodów), a następnie zrzut zrzutu stosu z Javy, gdzie wszystkie wątki są nazywane „Thread-1”, „Thread-2”, „Thread-3” nie zawsze jest bardzo użyteczny (zależy to od tego, jakie są twoje wątki ustrukturyzowane i czy można pożytecznie stwierdzić, który jest po prostu przez ich ślad stosu - nie zawsze jest to możliwe, jeśli używasz grup wielu wątków, wszystkie z tym samym kodem).
Powiedziawszy, że możesz oczywiście zrobić powyższe w sposób ogólny, tworząc rozszerzenie klasy wątku, która ustawia swoją nazwę na ślad stosu wywołania jej utworzenia, a następnie użyj tego z implementacjami Runnable zamiast standardowej klasy wątku java (patrz poniżej), ale oprócz śledzenia stosu może być więcej informacji specyficznych dla kontekstu, które byłyby przydatne w nazwie wątku do debugowania (odwołanie do jednej z wielu kolejek lub gniazd, które mógłby przetwarzać, na przykład, w którym to przypadku wolisz rozszerz Wątek specjalnie dla tego przypadku, aby kompilator zmusił Ciebie (lub inne osoby korzystające z twoich bibliotek) do przekazania pewnych informacji (np. kolejki / gniazda) do użycia w nazwie).
Oto przykład ogólnego wątku ze śladami stosu wywołującego jako jego nazwą:
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"));
}
}
a oto próbka wyników porównująca dwie nazwy:
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]