자바 스레드 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 답변

  • 좋아요

    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

    참조하세요.

    • 답변 감사합니다. 말씀하신 방법으로 스레드를 찾아내는데까지는 성공했습니다. 근데 C의 kill과 달리 interrupt()를 부른다고 해서 무조건 바로 꺼지는 것은 아니더라구요..ㅠㅠ 이부분은 조금 더 연구를 해봐야 할 것 같아요. 답변 감사합니다! hee 2017.7.28 00:43
  • 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);
        }
    }
    
    • 댓글을 잊고 있었네요. 자바 스레드 특성상 멈춰도 제대로 멈추지 않는 모양이더라구요..ㅠㅜ 감사합니다! hee 2017.8.5 01:36

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)