2013-06-06 2 views
1

스레드와 관련된 실행 가능한 개체의지도를 사용하여 실행 파일을 추적합니다. interruptedException이 던져진이 뒤에있는 목적은 현재 스레드와 해당 실행 가능 개체에 액세스하려고합니다. 내가 스레드 풀에 실행 가능한 추가하고 때Java의 스레드 풀에서 Runnables를 추적하는 방법은 무엇입니까?

Map<Thread, Runnable> myMap = new Map<Thread, Runnable>(); 
ExecutorService pool = Executors.newFixedThreadPool(5); 
pool.execute(new myRunnable()); 

는하지만, 내가지도를 채울 수있는 방법을 생각할 수 없다.

Thread 및 Runnable 객체가 포함 된지도에 항목을 어떻게 추가합니까?

+3

당신의 목표는 명확하지 않다. thead 실행이 중단되면 해당 스레드 내에서 (즉, 실행 파일에서) 인터럽트 플래그에 액세스 할 수 있습니다. – assylias

+0

일단 스레드가 인터럽트되면 runnable 객체에 정의 된 메소드에 액세스해야합니다. 귀하의 제안은 도움이됩니다. 감사합니다. – cmbendre

답변

3

당신은 잘못된 각도에서 접근하고있다. 스레드에 제출하면 작업이 완료되었다는 인상을 받아야합니다. 발생하는 인터럽트는 실행 스레드가 처리해야합니다. 예를 들어

public void run(){ 
    try{ 
     //do some work that responds to interruption 
    }catch(InterruptedException ex){ 
     //clean up 
    } 
} 

또는

public void run(){ 
    if(Thread.currentThread().isInterrtuped()){ 
     //clean up 
     return; 
    } 
] 
1

ExecutorService의 배경은 사용되는 스레드에서 추상화하는 것입니다. myRunnable을 오버라이드하여 정보를 유출 할 수 있습니다. originalRunnableObject이에 저장된 참조입니다 -

그래서 당신은

pool.execute(new myRunnable(myMap)); 

다음 myRunnable에서

이 생성자에는 myMap에 대한 참조를 저장하고 실행 방법에

myMap.put(this,originalRunnableObject) 

를 추가해야 부를 것이다. 물론 당신은 당신의지도가 동시적인지도가되어야한다. (당신이하려는 것처럼 Map 인터페이스를 인스턴스화 할 수 없다).

그러나 내가 왜 집행자가 당신이 파괴하려는 것처럼 보이는 추상화 계층을 제공한다고 말했기 때문에 처음부터이 작업을 수행 할 것인지 묻는 것이 좋습니다.

2

당신은 가능한 ThreadPoolExecutor의 후크 방법을 사용할 수 있습니다

final Map<Runnable, Thread> map = new ConcurrentHashMap<Runable, Thread>(); 
    ExecutorService pool = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()) { 
     @Override 
     protected void beforeExecute(Thread t, Runnable r) { 
      map.put(r, t); 
     } 

     @Override 
     protected void afterExecute(Runnable r, Throwable t) { 
      map.remove(r); 
     } 
    }; 
+1

그 질문에 답하지만 그것이 필요하다는 것을 의문의 여지가 있습니다. – assylias

+1

@Evgeniy Dorofeev 당신이 이것을한다면, 당신은'HashMap'을 사용해서는 안됩니다. 'afterExecute' 메소드는 호출하는 스레드에서 동시 변경을 의미하는 방식으로 호출됩니다. –

관련 문제