2009-05-07 5 views
4

내 메인 프로세스가 외부 라이브러리 메소드를 호출합니다. 이 방법은 때때로 중단됩니다. 다른 회사가 책임 져서 외부 라이브러리를 수정할 수 없습니다.주어진 실행 시간으로 스레드 시작

정의 된 실행 타이머로 라이브러리 호출 용 스레드를 사용하고 싶습니다. 메소드 호출이 오래 걸리면, 메소드 호출이있는 Runnable을 가진 Thread가 멈추고 메인 프로세스가 앞으로 나아가 야합니다.

  1. 메인 쓰레드는
  2. 가 스레드를 실행 기다릴
    • 시작
    • 타이머 스레드가 완료
    • 가 실행 스레드를
  3. 을 실행 죽일 타이머 스레드가 스레드 홈페이지
  4. 스레드 이력서
  5. 을 중지 시작

누군가이 논리가 필요한 코드를 가지고 있습니까? 디자인 패턴을 사용할 수 있습니까? 아니면 인터넷 페이지를 읽을 수 있습니까?

감사합니다.

답변

2

자바 5 이상에서 java.lang.concurrent 패키지, 특히 CompletionService 인터페이스와이를 구현하는 클래스를 살펴보십시오.

이 인터페이스에는 작업을 제출하고 완료 될 때까지 기다리거나 시간 초과 후 계속할 수있는 호출이 포함됩니다.

2

스레드 완료까지 30 초 정도 기다립니다.

Thread t = new Thread() { 
    public void run() { 
    badExternalMethod(); 
    synchronized (this) { 
     notifyAll(); 
    } 
    } 
}; 

synchronized (t) { 
    t.start(); 
    try { 
    t.wait(30000); // 30 secs 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
} 

// t이 완료 또는

+0

t.wait (30000) 대신 t.join (30000)을 의미한다고 생각합니다. –

+0

고마워, 코드를 테스트하고 외부 라이브러리에 어떤 일이 일어나고 어떤 리소스가 처리되지 않는지 확인합니다. –

1

당신은 마술 30 초 후에 실행중인 스레드 정지를 할 수 없습니다 시간이 종료되었습니다; 당신이해야 할 일은 그 스레드가 시간이 지나면 어떤 상태를 확인하게하고, 너무 길어서 run 메소드에서 return을 찍었음을 확인하는 것입니다.

이 일을하는 두 가지 방법은 대략 다음과 같습니다

  1. 라이브러리 호출 스레드가 시간마다 소량을 "덩어리"에 그 작업을 수행했으며, 각 청크의 상태를 확인합니다. 예를 들어, 수십만 개의 레코드를 처리하는 경우 한 배치에서 수백 개를 처리 한 다음 플래그를 확인하십시오. 또는 타임 아웃을 사용할 수있는 잠재적으로 블로킹 호출을하는 경우 타임 아웃을 500ms로 설정하고 각 호출 사이에 플래그를 확인하십시오.
  2. 시간이 끝나면 주 스레드가 라이브러리 호출 스레드를 인터럽트하고 라이브러리 스레드가 인터럽트를 올바르게 처리하고이 경우 해당 플래그를 확인하도록하십시오. 이것은 라이브러리 호출 스레드가 인터럽트 가능한 메소드를 수행 할 것을 요구하지만, 잠재적으로 장기 실행되는 메소드는 인터럽트를 허용해야합니다. 두 경우 모두

, 당신은 스레드 중 하나 (아마도 메인 쓰레드가 할 수있는 다른 아무 상관이 없기 때문에) 시간이 다되면 ((가) true에 플래그를 "정지"로 설정하고이 변수가 필요 것 모든 스레드가 업데이트를 볼 수 있도록 volatile로 선언해야합니다.) 마찬가지로, 라이브러리 호출 스레드가이 플래그를 true로 간주하면 일반적으로 run() 메소드에서 리턴하여 수행중인 작업을 중지해야합니다.

주 스레드에서 실제로 라이브러리 스레드를 죽이지 않아야합니다. 이유에 대해서는 Why are Thread.stop, Thread.suspend and Thread.resume Deprecated을 참조하고 위에 설명한 내용과 매우 비슷하게 보이는 대안을 찾아보십시오.:-)

+0

외부 호출이 중단 될 때 정상적으로 주 프로세스를 종료합니다. 나는 외부 라이브러리가 무엇을하는지 모릅니다. 그래서 스레드를 죽일 때 무슨 일이 일어나고 있는지 말할 수 없습니다. –