Developer MJ Story

[Java/Thread] Java Thread 바로 종료 시키기 – interrupt() 본문

Software/Java

[Java/Thread] Java Thread 바로 종료 시키기 – interrupt()

집근처 2014. 7. 22. 15:38
반응형

Java프로그래밍을 하다보면 thread를 사용하는 경우가 많이 있습니다.

Network socket이나, DB등을 사용하는 경우 thread를 꼭 사용하게 됩니다. 특히 anroid 같이 UI 작업을 하는 경우 더욱더 많이 사용합니다.

모든 프로그래밍이 그렇듯이 만들었으면 삭제? 종료를 시켜야 error를 줄이고 issue를 최소화 할 수 있습니다.

그런데 원래? 아니 예전에 Thread를 종료시키기 위해 사용했던 stop()은 sun에서 사용 하지 말라고 했죠. 헐, 그럼 Thread는 어떻게 종료 시키란 말이지?

프로그래밍은 검색이다. 라는 말이 있듯이? 바로 검색

검색에서 찾은 방법은 while문의 Boolean flag를 통해 해당 thread 동작을 멈추는 것…..아 이거 말고 없나? 이건 아닌 것 같은데..

싶어서 책을 뒤적뒤적…..올레! 찾았다. 답은 Interrup() 였습니다.

 

While 문에 Boolean flag를 통해 종료 시키는 방법은 risk가 큽니다. 특히, while loop이 heavy 하여 one cycle이 올래 걸리는 경우 원하는 시점에 thread가 종료 되지 않아, 원치 않는 버그, error, issue가 발생 할 수 있습니다.

그러나 interrup는 원하는 시점? 호출하는 시점에 바로 thread를 종료 시킬 수 있어 개발자가 원하는 대로 thread를 control할 수 있습니다.

말은 주저리 주저리 썼지만 code는 정말 간단합니다.

 

class StopThread implements Runnable {

    @Override

    public void run() {

        try {

            while (!Thread.currentThread().isInterrupted()) {                

                System.out.println("Thread is sleeping....");

                Thread.sleep(10000);

                System.out.println("Thread is live!");

            }

        } catch (InterruptedException e) {

 

        } finally{

            System.out.println("Thread is dead!");

        }

    }

}

 

먼저, Thread 입니다. Thread의 경우 Runnable implements로 구현하였습니다.

while문에 interrupt발생시 종료 되도록 등록하고, thread를 deep sleep 시킵니다.

 

    public void test(){

        StopThread stThread = new StopThread();

        Thread thread = new Thread(stThread);

        thread.start();

        

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }        

        System.out.println("죽어라!");

        thread.interrupt();

    }

 

test() 함수에서 Thread 만들어 시작시킵니다. 그리고 1 sleep thread interrupt 발생켜 thread 종료 시킵니다.

 

 

프로그램을 실행 시켜보면 deep sleep 중인 thread interrupt 호출 바로 Thread is dead! consle 찍는 것을 확인 있습니다.

알고 보면 정말 쉽죠??

반응형