[Android SDK] [Android] Thread의 interrupt()와 stop()

 

 

■ Thread.stop() Deprecated 된 이

 

Thread는 run() 메서드 내부의 코드가 모두 실행되면 자동적으로 종료됩니다. 하지만, 경우에 따라 개발자는 실행 중인 Thread를 즉시 종료할 필요가 발생할 수 있습니다. 예를 들어, 음악이 틀어져 있는 상태에서 음악의 진행도를 Progress로 표현하고자할 때 Thread를 사용한다면, 음악이 종료되었을 때, 더 이상 Progress를 변화시킬 필요가 없으므로 Thread를 종료시켜 메모리를 절약해야 합니다.

이전에는 이러한 경우에 Thread의 stop() 메서드를 호출하여 종료시켰지만, Oracle이 제공하는 Java API 문서에 따르면, This method is inherently unsafe. 를 시작으로 메서드가 사라졌음을 알려줍니다. 말 그대로, stop() 메서드를 통해 Thread가 갑자기 종료되면, Thread가 사용 중이던 자원들이 Unsafe한 상태로 남겨지기 때문에 데드락 등 여러 문제를 초래할 수 있습니다.

 

■ Thread를 안전하게 종료하는 여러가지 방법들

 

deprecated된 stop() 메서드 대신, Thread를 safe하게 종료할 수 있는 여러가지 방법들이 있습니다.

차근차근 하나씩 살펴보도록 하겠습니다.

 

□ run() 메서드내에 flag를 사용하여 종료

class MyThread(var stopFlag: Boolean = false) : Thread(){

    override fun run() {
        super.run()
        
        while(!stopFlag) {
            Log.d("Thread", "실행중")
        }
        
        Log.d("Thread", "자원 정리")
        Log.d("Thread", "실행 종료")
    }
}

 

위의 코드에서 외부에서 stopFlag가 true로 설정하면, 실행하고 있던 while문의 코드 블럭을 빠져나와, Thread가 사용 중이던 자원을 정리하고, run() 메서드가 끝나게 됨으로써 Thread가 safe하게 종료됩니다.

 

□ Thread의 interrupt() 메서드

interrupt는 운영체제 관점에서 보았을 때, CPU가 입출력을 요청하고 나서, I/O Device에 의해 입출력 완료 신호를 전송받는 하나의 신호입니다. 일반적으로 시분할 (TimeSharing) 시스템이나 멀티 프로그래밍 방식에서 interrupt가 발생하면 다음 Process에게 CPU 사용 권한이 넘어갑니다.

Thread에서 interrupt()는 Thread가 일시 정지 상태에 있을 때, InterruptedException 예외를 발생시키는 역할을 한니다.

여기서 중요한 점은, sleep()과 같은 일시정지 상태가 되는 메서드가 호출이 되어야 한다는 점입니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

만약 run() 메서드 내에 일시정지되는 부분이 없다면, interrupt() 메서드를 호출한다 하더라도, 본질적으로 예외 처리(catch) 블록으로 이동하지 않기 때문입니다.

 

class MyThread : Thread(){

    override fun run() {
        super.run()

        while(true) {
            try {
                sleep(1L) // 잠깐이라도 일시정지가 되어야 함.
                Log.d("Thread", "실행중")
            }catch (e: InterruptedException) {
            	Log.d("Thread", "인터럽트 발생")
                Log.d("Thread", "자원 정리")
                Log.d("Thread", "실행 종료")
            }
        }

    }
}

fun main() {
    val myThread = MyThread()
    myThread.interrupt() // 인터럽트 발생
}

 

위의 코드에서 정상적으로 Thread 내의 while문을 반복하다가 외부에서 interrupt() 메서드를 호출하면 예외 처리(catch)블록으로 이동하여 Thread가 종료될 것입니다.

만약 sleep(1L)가 없다면, 앞서 말씀드린 것처럼 interrupt() 메서드 호출은 아무런 의미가 없어지게 됩니다.

하지만 sleep을 사용하는 것은 결코 최선의 해결책이라고 보기엔 어렵다고 생각합니다.

실제 프로젝트를 구현함에 있어서 sleep을 통해 잠시 일시정지가 된다는 것은 자원을 비효율적으로 사용한다고 볼 수 있기 때문입니다.

 

□ Thread의 isInterrupted 조건

Thread 클래스에는 getIsInterrupted() 라는 유용한 메서드를 제공합니다. 해당 메서드는 interrupt() 메서드가 호출되면 값이 True로 변하면서 더 이상 Thread가 동작할 필요가 없음을 알려줍니다.

class MyThread : Thread(){

    override fun run() {
        super.run()

        while(true) {
            if(isInterrupted) {
                Log.d("Thread", "인터럽트 발생")
                Log.d("Thread", "자원 정리")
                Log.d("Thread", "실행 종료")
                break
            }
            Log.d("Thread", "실행중")
        }

    }
}

fun main() {
    val myThread = MyThread()
    myThread.interrupt() // 인터럽트 발생
}

 

이전 코드와 달라진 점이 있다면, sleep(1L) 메서드가 사라지고 isInterrupted라는 조건문이 하나 추가되었으며, 예외 처리 (try ... catch) 블럭이 사라졌다는 것입니다. 이전에 비해 훨씬 코드가 깔끔해지고, 일시정지 상태가 되지 않기 때문에,  sleep을 통해 잠시 시간이 지체되는 것보다 비교적 Thread를 빠르게 종료시킬 수 있습니다.

 

[출처] https://itstory1592.tistory.com/72

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
67 [Android SDK] [안드로이드] 접속된 네트워크 인터페이스의 IP 주소 가져오기 졸리운_곰 2024.05.02 191
66 [Android SDK] [안드로이드] 핸드폰 번호, 기기 고유 id 등 단말기 정보 가져오기 file 졸리운_곰 2024.05.02 451
65 [Android SDK] Android) 안드로이드 Jsoup로 웹크롤링 하기 (예제포함) - "데일리 브리핑 앱 개발기" file 졸리운_곰 2024.05.01 138
64 [Android SDK] [Android] Activity 생명주기와 이동 file 졸리운_곰 2024.05.01 182
63 [Android SDK] [Android] EditText 읽기 전용으로 만들기 졸리운_곰 2024.05.01 120
62 [Android SDK] 안드로이드: 간단한 데이터를 저장하고 싶을 때(SharedPreferences 사용예제) 졸리운_곰 2024.05.01 145
61 [Android SDK] [Android] Jsoup 으로 파싱하기 file 졸리운_곰 2024.05.01 146
60 [Android SDK] [Android] 안드로이드 - 액티비티(Activity)로부터 결과 데이터 받아오기 file 졸리운_곰 2024.05.01 166
59 [Android SDK] [안드로이드/Android] 기기 네트워크 연결 상태 확인 file 졸리운_곰 2024.05.01 138
58 [Android SDK] 안드로이드 - 메시징 - Toast 졸리운_곰 2024.05.01 201
57 [Android SDK] [Android] 안드로이드 Alert 창 띄우기 file 졸리운_곰 2024.05.01 170
56 [Android SDK] 버튼을 클릭하면, 동작하는 코드를 작성하는 방법 졸리운_곰 2024.05.01 120
55 [Android SDK] [ Android ] a webview method was called on thread 'javabridge' 에러가 발생했을 때 졸리운_곰 2024.05.01 202
54 [Android SDK] [안드로이드] Thread, TimerTask, Handler 반복 호출 만들기 JAVA 졸리운_곰 2024.05.01 157
53 [Android SDK] [Android] postDelayed()를 이용해서 주기적 메소드 실행 졸리운_곰 2024.05.01 144
52 [Android SDK] Making Android WebView autorefresh periodically 졸리운_곰 2024.05.01 168
51 [Android SDK] [안드로이드] 시스템 멈추기 - Sleep() 사용법 file 졸리운_곰 2024.05.01 140
50 [Android SDK] 안드로이드 스레드 예제. 스레드로 고민해보기. (Android Thread UseCase) file 졸리운_곰 2024.05.01 143
» [Android SDK] [Android] Thread의 interrupt()와 stop() file 졸리운_곰 2024.05.01 188
48 [Android SDK] [Android Studio] 간단하게 일정시간 지연시키는 딜레이주기 Delay 안드로이드 스튜디오 file 졸리운_곰 2024.05.01 104
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED