여기에있는 모든 사람들은 Runnable을 구현하는 것이 갈 길이라고 생각하고 실제로 의견에 동의하지 않지만 내 의견으로는 Thread를 확장하는 경우도 있습니다. 실제로 코드에서 설명했습니다.
Runnable을 구현하면 Runnable을 구현하는 클래스는 스레드 이름을 제어 할 수 없으며 스레드 이름을 설정할 수있는 호출 코드입니다.
new Thread(myRunnable,"WhateverNameiFeelLike");
그러나 Thread를 확장하면 클래스 자체에서이를 관리하게됩니다 (예와 같이 스레드 이름을 'ThreadB'로 지정). 이 경우에는
A) 디버깅 목적으로 더 유용한 이름을 줄 수 있습니다.
B) 그 이름을 해당 클래스의 모든 인스턴스에 사용하도록 강요하고 있습니다 (스레드라는 사실을 무시하고 Runnable 인 것처럼 위와 같이하지는 않지만 여기서는 관습에 대해 이야기하고 있습니다) 내가 느끼는 그 가능성을 무시하십시오).
예를 들어 생성의 스택 추적을 가져와 스레드 이름으로 사용할 수도 있습니다. 이것은 이상하게 보일 수 있지만 코드 구성 방식에 따라 디버깅 목적으로 매우 유용 할 수 있습니다.
이것은 작은 것 같지만 많은 스레드가있는 매우 복잡한 응용 프로그램이 있고 갑작스런 일이 '중지되었습니다'(교착 상태 또는 네트워크 프로토콜의 결함으로 인해) 명백한-또는 다른 끝없는 이유) 그런 다음 모든 스레드가 'Thread-1', 'Thread-2', 'Thread-3'이라고하는 Java에서 스택 덤프를 얻는 것이 항상 유용한 것은 아닙니다 (스레드가 어떻게 작동하는지에 달려 있습니다) 스택 추적으로 어떤 것을 추적 할 수 있는지 유용하게 알 수 있는지 여부-동일한 코드를 실행하는 여러 스레드 그룹을 사용하는 경우 항상 가능하지는 않습니다).
물론 이름을 생성 호출의 스택 추적으로 설정하고 표준 Java Thread 클래스 대신 Runnable 구현과 함께 사용하는 스레드 클래스의 확장을 작성하여 일반적인 방법으로 위의 작업을 수행 할 수 있다고 말 했음 (아래 참조) 스택 추적 외에도 디버깅을 위해 스레드 이름에 유용한 더 많은 컨텍스트 특정 정보가있을 수 있습니다 (예 : 처리 할 수있는 많은 대기열 또는 소켓 중 하나에 대한 참조) 이 경우 스레드를 구체적으로 확장하여 컴파일러가 (또는 라이브러리를 사용하는 다른 사람들이) 이름에 사용하기 위해 특정 정보 (예 : 해당 큐 / 소켓)를 전달하도록 할 수 있습니다.
다음은 호출 스택 추적을 이름으로 사용하는 일반 스레드의 예입니다.
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]