2011-09-29 4 views
2

5 초 동안 실행 된 스레드를 중지하려면 어떻게합니까?시간이 지난 후에 스레드를 중지하십시오.

자바 5+ 스레딩 기능 (j2me에서 작동해야 함)을 사용할 수 없습니다.


가능한 솔루션 -

일정 두 개의 스레드. 실제 작업 (T1)을 수행하고 다른 작업은 T1 (T2)의 모니터로 작동합니다.

T1이 시작되면 T2를 시작하십시오. T2는 매초마다 T1에서 isalive() 메서드를 호출하고, 10 초 후 T2가 죽지 않으면 T1에서 T2가 중단되어 T1 스레드가 종료됩니다.

이 가능한가요?

Timer timer = new Timer(); 

TimerTask timerTask = new TimerTask() { 

public void run() { 
     getPostData(); 
    } 
}; 

timer.schedule(timerTask, 0); 

public void abortNow() { 
    try { 
     _httpConnection.close(); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
+0

j2me와 작동해야하므로 executorervice 클래스를 사용할 수 없습니다. –

답변

1

귀하의 질문에 대한 유일한 답변은 없습니다. 스레드가 수행하는 작업에 따라 다릅니다. 우선, 어떻게 그 스레드를 중지 할 계획입니까?

  1. 가 몇 가지 물건을 정성 들여,이 물건이 할 수있는 등 하나의 "작업"으로 "토큰"으로 만들어지고, 스레드가 예를 들어 BlockingQueue에서 그들을 잡고 있다면, 당신은 너무와 스레드를 중지 할 수 있습니다 "poison pill"이라고 불리는 쓰레드는 쓰레드가 읽는 모의 태스크처럼 "Hey man, Shut down to shut down"이라고 말합니다.
  2. 스레드가 "단계"로 나눌 수없는 작업을 수행하는 경우 스레드가 종료 될 수 있다고 생각하는 방식을 실제로 알려야합니다. 소켓에서 read()을 차단하면 소켓을 닫아 차단을 해제 할 수 있습니다.

있습니다 interrupt()은 정상적인 상황에서 Thread을 중지하는 것은 아닙니다, 당신 interrupt() 스레드 경우, 대부분의 경우 그냥 그 물건을 갈 것입니다. 99.9 %의 경우, interrupt()으로 스레드를 중지하는 것은 좋지 않은 디자인입니다.

어쨌든 5 초 후 멈추려면 Timer으로 설정하면됩니다. 또는 더 나은 join 시간 초과 5 초, 그 후, 그것을 중지하십시오. 문제는 그것을 멈추게하는 "방법"입니다. 그러니 더 나은 방법으로 당신을 도울 수 있도록 스레드가 어떻게 멈추어야한다고 생각하십니까?

스레드의 기능을 알려주십시오.

편집은 : 귀하의 코멘트, 단지 예에 대한 응답으로

class MyHTTPTransaction extends Thread { 
    public MyHTTPTransaction(.....) { 
     /* ... */ 
    } 
    public void run() { 
     /* do the stuff with the connection */ 
    } 
    public void abortNow() { 
     /* roughly close the connection ignoring exceptions */ 
    } 
} 

:

다음

MyHTTPTransaction thread = new MyHTTPTransaction(.....); 
thread.start(); 
thread.join(5000); 
/* check if the thread has completed or is still hanging. If it's hanging: */ 
    thread.abortNow(); 
/* else tell the user everything went fine */ 

또한 Timer 설정하거나 Lock들에 Condition를 사용 나는 약간의 경쟁 조건이있을 수 있다고 내기 때문입니다.

건배.

+1

스레드가 http 게시물을 보내고 있는데, 이는 한 번 실행됩니다. 문제는 네트워크 연결에 따라 다릅니다.이 게시물은 2 ~ 10 초 사이에 걸릴 수 있습니다.5 초 이상 걸리면 그냥 멈춰야합니다. 그래서 나는 어떻게 쓰레드가 멈추는 지 알지 못한다. 아마도 http 게시글에서 시간 초과를 설정할 수 있습니다. –

+1

그래,이 경우 HTTP 게시물에서 시간 초과를 설정해야합니다. 하지만 예를 들어 업로드가 1 바이트/초로 진행된다면 시간 초과가 있다고 생각하지 않습니다. 타임 아웃은 연결 핸드 셰이 킹 및 비활성을위한 것이며, "느린 활동"은 계속됩니다. 그래서 'Timer'를 설정할 수 있습니다.이 타이머는 5 초 후에 연결을 잔인하게 종료 시키므로 스레드가 부작용으로 멈추는 원인이됩니다. – gd1

+0

어떻게 이런 식으로 타이머를 사용할 수 있습니까? 일정 기간 후에 타이머에서 cancel 메서드를 사용한다는 의미입니까? –

관련 문제