자바 스레드 interrupt하기
조회수 3091회
안녕하세요. 안드로이드 프로그래밍을 하고 있습니다.
스레드를 통해 오래걸리는 작업을 따로 처리하고 있는데요, 동작중인 스레드를 멈추는 방법이 있나요?
가리키고 있는 스레드와 실제 동작하는 스레드가 달라서 그런지 isAlive()나 interrupt() 메소드가 동작하질 않습니다. 제가 생각하는 것과 너무 다르게 동작해서 좀 당황스럽네요..
다음은 코드 예시입니다.
ParserThread thread = new ParserThread();
thread.start();
if (thread != null && thread.isAlive())
thread.interrupt(); // isAlive()가 false를 반환해 실행되지 않음
/** 스레드 클래스 */
class ParserThread extends Thread {
@Override public void run() {
super.run();
// 오래 작업하는 영역 //
this.isAlive(); // 여기선 true 반환
}
}
인터넷을 아무리 뒤져봐도 동작중인 스레드를 얻을 수 있는 방법은 나오질 않더군요. 혹시 방법이 있을까요?
2 답변
-
자바 쓰레드에 관한 번역서가 1권 있습니다. 2000년도 초반께에 오렐리에서 출판되었을겁니다.
시중에서 구입은 어렵고 도서관에 가시면 보실 수 있습니다. 그나마 자바 쓰레드에 대한 유일한 전문서라고 할 수 있으니 꼭 참고하시기 바랍니다.
그리고 쓰레드 얻는 방법. ThreadGroup 를 이용하면 쓰레드을 얻을 수 있습니다.
ThreadGroup g = Thread.currentThread().getThreadGroup(); while (true) { ThreadGroup g2 = g.getParent(); if (g2 == null) { break; } else { g = g2; } } Thread[] threads= new Thread[256]; g.enumerate(threads)
와 같이 쓰레드 객체를 얻을 수 있습니다.
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
참조하세요.
-
start() 직 후 alive가 될 텐데요. 아래처럼 해보세요. (JDK 1.8 기준)
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ThreadTest2 { @SuppressWarnings("unused") private static final Logger logger = LoggerFactory.getLogger(ThreadTest2.class); public static void main(String[] args) { ChildThread thread = new ChildThread(); // thread != null; // thread 변수는 null일 수 없음 thread.start(); if (!thread.isAlive()) { throw new IllegalAccessError("여기 오면 안되는데"); } thread.interrupt(); if (!thread.isInterrupted()) { throw new IllegalAccessError("여기 오면 안되는데 2"); } } } class ChildThread extends Thread { private static final Logger logger = LoggerFactory.getLogger(ChildThread.class); @Override public void run() { doUselessThing(); this.isAlive(); } @Override public void interrupt() { logger.debug("i'm dying. :<"); super.interrupt(); } private void doUselessThing() { logger.debug("do useless thing: start"); long sum = 0; for (int i = 0; i < Integer.MAX_VALUE; i++) { sum += i; } logger.debug("do useless thing: end, sum is {}", sum); } }
댓글 입력