2009-12-21 3 views
2

SwingWorker 스레드에서 발생하는 끔찍한 예외를 디버깅하려고합니다. SwingWorker 스레드의 이름을 지정할 수 있다면 내가받는 스택 추적을 더 잘 해석 할 수 있습니다.SwingWorker 스레드의 이름은 어떻게 지정합니까? 코드 또는 모범 사례 열기

SwingWorker 스레드의 이름을 지정할 수있는 것 같지 않습니다 (그게 뭡니까?). 나는 최선의 관행이나 트릭을 찾고 있는데, 이는 내 코드가 포함 된 로그 문을 사용하지 않고 작업자 스레드를 올바르게 식별하는 데 도움이된다.

답변

8

SwingWorker가 사용하는 ThreadFactory에 액세스 할 수없는 동안 SwingWorker가 실행중인 클래스의 run() 또는 call() 메서드에서 Thread.currentThread(). setName()을 호출 할 수 있습니다.

그냥 스레드가 실제로 SwingWorker를 사용하는 스레드가 풀에서의 의미 Executors.defaultThreadFactory에서 인 코드

+0

좋은 답변입니다. 단순하고 직접적. –

1

를 실행 할 때 그 값을 설정하고 있는지 확인하십시오. 따라서 "MyXYZThread"가 스레드의 이름을 바꾸지 못하는 시스템의 다른 SwingWorker에서 재사용되는 경우 스레드의 이름을 잘못 지정하면 오해의 소지가 있습니다.

예외를 throw 할 때 이름을 포함하고 그 이름을 포함하도록 SwingWorker를 확장합니다.

참고 : 호출자가 예외 처리를 담당하게하지는 않겠지 만 SwingWorker 계약을 변경하지 않고 호출자가 처리 할 수있는 방법이 표시되지 않습니다.

private static abstract class MySwingWorker<X, Y> extends SwingWorker<X, Y> 
{ 
    private final String taskName; 
    public MySwingWorker(String name) 
    { 
     this.taskName = name; 
    } 
    public String getTaskName() { 
     return taskName; 
    } 
} 

사용법 :

new MySwingWorker<Object,Object>("my task") { 
    protected Object doInBackground() { 
     try { 
      return someCall(); 
     } 
     catch(Exception e) { 
      Logger.getLogger(getClass().getName()).log(Level.SEVERE, 
       "Exception in " + getTaskName(), e); 
      throw e; 
     } 
    } 
}.execute(); 
0

당신은 스레드를 얻기 위해 반사를 사용할뿐만 아니라에서는 setName를 호출 할 수 있어야합니다. 이를 수행하려면 setAccessible 메소드를 사용해야하고, 액세스해야하는 변수의 이름을 찾으려면 일부를 파고들 필요가 있습니다.

나는이 방법을 선호하지 것이지만, 다른 방법만큼 "해키"있을 수는 ...

0

가장 좋은 방법은 이미 언급는 Thread.currentThread()를 사용하는 것입니다.에서는 setName (문자열).

A "트릭은"SwingWorkers의의 ThreadFactory를 설정 될 것이다 : 당신이 경고했습니다 있도록

sun.awt.AppContext context = sun.awt.AppContext.getAppContext(); 

int maxWorkers = 10; 
ThreadFactory factory = ... 
ExecutorService executor = Executors.newFixedThreadPool(maxWorkers, factory); 

context.put(SwingWorker.class, executor); 

이는하는 sun.awt 패키지에서 클래스를 사용합니다.

+1

태양 패키지와 "베스트 프랙티스"자체는 모순입니다 :-) – kleopatra

+0

"모범 사례"는 Thread.setName (String)을 사용하고있었습니다. 태양 패키지를 사용하는 것은 "트릭"이었습니다. –