2012-08-02 2 views
4

스레드 덤프에는 풍부한 정보가 포함되어 있습니다. 예를 들어 어떤 액션이 두 번 이상 실행 된 것으로 의심되면 액션이 시작될 때마다 스택 추적을 덤프 한 다음 스택에서 잘못된 액션 발생을 조사해야합니다.스레드와 같은 SwingWorker 용 Java 스레드 문제 해결

특정 상황에서 개발자는 순차적 실행의 개념적 단순성을 포기할 것을 권장합니다. 예를 들어, Swing은 단일 스레드 EDT의 한계를 해결하기 위해 SwingWorker 도우미를 제공합니다. 자, stack trace를 덤프하면 SwingWorker에 의해 액션이 시작되고 누가 SwingWorker 태스크를 시작했는지에 대한 정보가 없으므로 쓸모가 없습니다.

어떻게 문제를 해결할 수 있습니까? 진정한 원인을 따르기 위해 스레드 덤프를 "재지향"시키는 영리한 트릭이 있습니까?

답변

2

스택을 만들 때 (또는 실행했지만 마지막이기 때문에 다른 실행 방법을 만들어야하는 경우) 스택을 기록하도록 SwingWorker를 확장 할 수 있습니다. 그래서,

java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: Exception in SwingWorker! 
     at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222) 
<snip> 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
    Caused by: java.lang.Exception: SwingWorker created at: 
     at TracedSwingWorker.<init>(TracedSwingWorker.java:15) 
     at TracedSwingWorker$2.<init>(TracedSwingWorker.java:60) 
     at TracedSwingWorker.main(TracedSwingWorker.java:60) 
0

나는 당신이 이미 알고있는 것을 이야기 할 수도 있지만 난 당신이 IDE를 사용하는 경우, 다음이 좋은 ThreadDump

http://www.oracle.com/technetwork/java/javase/tooldescr-136044.html#gbmpn

을 제안 : http://netbeans.org/kb/docs/java/debug-multithreaded.html

내가

넷빈즈 Eclipse를 많이 사용했다. 디버거 뷰는 여러 스레드를 시각화하고 추적하고, 스택을 인쇄하고 일시 중지하는 수단을 제공합니다.

+0

SwingWorker의이 작업을 더 진행 시작 스레드 : 원인을 만들기 디버그

import java.util.concurrent.ExecutionException; import javax.swing.SwingWorker; public abstract class TracedSwingWorker<T, V> extends SwingWorker<T, V> { private final Exception cause; public TracedSwingWorker() { super(); this.cause = new Exception("TracedSwingWorker created at:"); } @Override protected final T doInBackground() throws Exception { try { return doWorkInBackground(); } catch(Exception e) { if(this.cause != null) { Throwable cause = e; while(cause.getCause() != null) { cause = cause.getCause(); } cause.initCause(this.cause); } throw e; } } protected abstract T doWorkInBackground(); // just for testing public static void main(String[] args) { new TracedSwingWorker<Void, Void>() { @Override protected Void doWorkInBackground() { throw new IllegalArgumentException("Exception in TracedSwingWorker!"); } @Override protected void done() { try { get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }.execute(); } } 

인쇄 (로그 수준 또는 일부 등을 확인)에만 그래서 당신이 그것을 수행 할 수 있습니다하지만 비용이 상대적으로 현재 작업자 작업에서 재미있는 이벤트가 스레드 덤프/디버거 상태에서 유실되었습니다. –

+0

나는 본다. 무슨 일이 일어나고 이벤트를 잡는 지 아십니까? 그렇게하면 DynamicProxy를 사용하여 스택 추적을 일시 중지하거나 인쇄 할 수 있습니다. – Edmon

관련 문제