2014-03-24 5 views
0

필요 : 1. 핫 스레드 (항상 존재하며 그 번호는 미리 알고있다)와 프리 스레드 (타임 아웃이 만료되면 인터럽트)가있다.Runnable을 구현할 때

구현합니다. 1. 클래스 HotThread는 Runnable을 구현합니다. 2. 클래스 FreeThread는 HotThread를 확장합니다 (타이머 추가). 3. 플래너로 ThreadPool 클래스. 메소드가 있습니다 : addFreeThread(), cancelTask ​​(int id).

내 addFreeThread은 다음과 같습니다

public void addFreeThread() { 
     FreeThread ft = new FreeThread(timeout); 
     Thread t = new Thread(ft);     
     ft.startTimer(t); 
    } 

는 지금은 cancelTask을 구현하기 시작합니다

public void cancelTask(int id) { 
     ... // get Thread threadToCancel from the ThreadPool. 
     threadToCancel.interrupt();   

    } 

보다 큰 보인다. 그러나 타이머는 여전히 별도의 스레드에서 실행 중입니다. 타이머는 FreeThread 클래스의 인스턴스에서 시작되었습니다. 나는 자유로운 실을 시작할 때 그것을 알았다. 그러나 지금 나는 그것을 어디에서 발견해야할지 모른다.

Runnable을 구현하면 나에게 많은 혼란을 줄 수 있습니다. 아마도 실에서 ft를 추출 할 수 있을까요? 불가능한 것 같아. 나는 이것을 ThreadPool에 보관할 것인가? 이미 스레드와 해당 ID가있는 HashMap을 유지하고있어 번거로운 작업입니다. 나는 아이디와 그들의 fts를 유지하기 위해 또 다른 HashMap을 유지하는 것을 좋아하지 않을 것이다.

나에게 힌트를 주시겠습니까?

+0

@Roberto Sánchez, 아니, 나는 그런 말을하지 않을 것이다. 여기서 타이머를 취소하는 방법에 대한 도움이 필요합니다. 반면에 더 일반적인 질문이 논의됩니다. – Trts

+0

프리 스레드가 자체 타이머를 실행하게하는 것은 어떻습니까? 이렇게하면 타이머가 만료되면 자체를 취소 할 수 있습니다. –

답변

0

런타임에 의 Runnable 대상을 얻는 방법이 없습니다. Runnable을 구현하는 대신 Thread을 확장하거나 FreeThread의지도를 별도로 보관할 수 있습니다.

0

FreeThread.startTimer(Thread t) 메서드는 스레드에 대한 핸들을 수신하여 저장하고 나중에 인터럽트/취소 할 때 사용합니다. ThreadPool은 인터럽트/취소를 FreeThread에 위임하거나 단순히 FreeThread에 저장된 스레드 핸들을 요청합니다.

관련 문제