2012-05-29 5 views
1

스프링의 ThreadPoolTaskExecutor을 사용하기 위해 일부 기존 코드를 수정하고 있습니다. 이 응용 프로그램에는 스레드를 비동기 적으로 시작한 다음 getState() 호출을 사용하여 상태를 모니터하는 상위 브로커 프로세스가 있습니다. ThreadPoolTaskExecutorexecute() 메서드가 자식 스레드를 실행하는 데 사용되었으므로 getState()은 자식 스레드의 run() 메서드가 완료된 후에도 항상 "NEW"를 반환합니다.ThreadPoolTaskExecutor를 사용하여 스레드 상태를 얻는 방법은 무엇입니까?

하나의 대안은 수동으로 상태 정보를 제공하는 자식 스레드 객체 내의 속성을 유지하는 것이지만 ThreadPoolTaskExecutor을 사용할 때 스레드 상태를 얻기위한 알려진 방법이 있는지 궁금합니다.

+0

주된 이유는 외부 감시 목적이다. 우리는 스레드의 수와 상태를 표시하는 웹 페이지를 가지고 있습니다. – opike

+0

굉장한 질문입니다. 나는 또한 이것을 필요로한다! 감사! –

답변

1

Runnable을 구현하는 클래스를 통과해야 할 때 Thread으로 확장되는 클래스를 execute()으로 전달할 수 있습니다. 그렇다면 Thread 클래스는 이 아니며이 시작되며 항상 의미가있는 NEW 상태로 표시됩니다.

execute() methodRunnable 클래스입니다. 코드가 작동하는 유일한 이유는 Thread도 실행 가능을 구현한다는 것입니다. ThreadPoolTaskExecutor 클래스는 자체 스레드를 내부적으로 관리합니다. 그러면 Thread 클래스는 스레드로 시작되지 않으며 해당 run() 메서드 만 호출됩니다.

2

Runnable 대신 Callable을 사용하고 대신 execute use submit를 사용하십시오.

Sample usage for Callable 

    private class TaskCallable implements Callable<SomeResponse> { 
     private final SomeRequest request; 

     public TaskCallable (final SomeRequest request) { 
      this.request = request; 
     } 

     public SomeResponse call() throws Exception { 
      SomeResponse response = someService.getData(request); 
      return response; 
     } 
    } 

    TaskCallable callable = new TaskCallable(request); 
    Future<SomeResponse> future = pooledExecutor.submit(callable); 

당신이 future.isDone을 ​​확인할 수 있습니다()

관련 문제