2011-01-05 6 views
3

나는 이것을 알아낼 수있는 어떤 것을 함께 해킹 할 수있을 것이라고 확신하지만, 내가 놓친 바로 그 해결책이 있기를 바라고있다. 나는 문서를 읽었지만 아무것도 보지 못했습니다.주어진 순간에 Java Executor가 실행중인 작업을 간단하게 알 수 있습니까?

내 특정 앱은 DelayQueue에 의해 뒷받침되는 ThreadPoolExecutor을 사용하고 있지만 중요하지는 않습니다.

감사합니다.

답변

6

나는이 작업을 수행 할 수있는 신뢰할 수있는 방법이라고 생각하지 않습니다. 카운트가 필요한 경우 사용할 수있는 메소드 (getTaskCount()/getCompletedTaskCount())가 있습니다. 실제 작업이 필요한 경우 AFAIK는 beforeExecute()를 재정 의하여 작업을 추적하기 위해 수동으로해야하며 afterExecute()는 한 가지 방법입니다.

+0

매우 간단하고 직접 내 질문에 대답합니다. 감사! –

10

하나 개의 간단한 방법 : 당신이 원하는 모든 데이터를 함께 전달하는 콜백 새 작업의 시작을 신호 호출 코드를 사용하여 작업을 마무리 :

interface StartTaskWatcher { 
    void taskStarted(Object data); 
} 

class StartTaskSignalingWrapper implements Runnable { 
    private final Runnable task; 
    private final String taskDescription; 
    private final StartTaskWatcher startTaskWatcher; 

    StartTaskSignalingWrapper(Runnable task, String taskDescription, StartTaskWatcher startTaskWatcher) { 
     this.task = task; 
     this.taskDescription = taskDescription; 
     this.startTaskWatcher = startTaskWatcher; 
    } 

    public void run() { 
     startTaskWatcher.taskStarted(taskDescription); 
     task.run(); 
    } 
} 
+0

좋은 제안, 좋은 코드, 감사합니다! –

1

, 실제로 런타임에 알 필요가 없거나 그냥 디버깅을 위해?

디버깅하는 경우 JVisualVM 응용 프로그램 (JDK의 'bin'디렉토리에 설치되어 있음)을 살펴보십시오. 실행중인 모든 스레드를 동적으로 검사 할 수 있으므로 약간의 통찰력을 제공 할 수 있습니다.

합니다 (JVisualVM도 실행 & 할당 핫스팟, CPU/메모리 프로파일 링을 수행하고, 실시간으로 쓰레기 수거 활동을 보여줍니다 수 있습니다.)

+0

실제로 모니터링 및 문제 해결을 위해 런타임에이를 필요로합니다. 그래도 좋은 정보, 감사합니다! –

관련 문제