귀하의 질문에 대한 유일한 답변은 없습니다. 스레드가 수행하는 작업에 따라 다릅니다. 우선, 어떻게 그 스레드를 중지 할 계획입니까?
- 가 몇 가지 물건을 정성 들여,이 물건이 할 수있는 등 하나의 "작업"으로 "토큰"으로 만들어지고, 스레드가 예를 들어
BlockingQueue
에서 그들을 잡고 있다면, 당신은 너무와 스레드를 중지 할 수 있습니다 "poison pill"이라고 불리는 쓰레드는 쓰레드가 읽는 모의 태스크처럼 "Hey man, Shut down to shut down"이라고 말합니다.
- 스레드가 "단계"로 나눌 수없는 작업을 수행하는 경우 스레드가 종료 될 수 있다고 생각하는 방식을 실제로 알려야합니다. 소켓에서
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
를 사용 나는 약간의 경쟁 조건이있을 수 있다고 내기 때문입니다.
건배.
출처
2011-09-29 10:05:38
gd1
j2me와 작동해야하므로 executorervice 클래스를 사용할 수 없습니다. –