티스토리 뷰


안드로이드에서 서버와의 통신작업 류 혹은 동시에 어떤 작업을 할 경우 스레드는 필수입니다.
전송이 끝나거나 작업이 끝나기를 동기적으로 대기하다 보면 사용자는 엄청 불편하겠죠.

그래서 스레드 작업을 많이 하게 되는데, RPC 콜이나 단순히 API를 사용하는 스레드라면 상관 없지만, 
루프문에서 같은 작업을 종료하기 전까지 무한으로 하게 되는 경우에는 사용자가 스레드를 종료해 줘야 합니다.

그래서 안드로이드는 Java기반이므로 Java 스레드 정책에 따라 종료해 보려고 해도 종료가 되지 않는 문제가 가끔 생기는 것을 발견하였습니다.

참고로, 자바에서는 Thread를 interrupt() 메소드를 이용하여 종료시킵니다.
기존에는 stop(), suspend() 등을 사용하였으나 동기화에 있어 문제가 생길 수 있기 때문에(Deadlock)
아래와 같이 interrupt() 메소드 호출을 통해 사용합니다.

Thread thread; // 인스턴스가 생성 되었다고 가정하겠습니다.
thread.interrupt(); 


하지만, 안드로이드에서는 어떤 이유인지 모르겠으나 interrupt()로 종료되지 않는 문제가 생기는 경우가 있습니다.
interrupt() 메소드는 안드로이드 시스템에 스레드 종료를 요청하는 것 뿐이기 때문에 어떠한 이유로 안드로이드가 종료를 시켜주지 않는다고 볼 수 있는데요.

그럴 때의 해결책은 간단합니다.
우선, 스레드의 run() 메소드에서의 루프문을 특정 플래그 변수를 조건으로 두고,
외부에서 그 플래그 변수를 접근할 수 있도록 합니다.

class WordsThread extends Thread {


private boolean isRunning;

public void run() {

while(isRunning) {

...



public void setRunningState(boolean state) {

isRunning = state;


위와 같이 Thread를 상속한 클래스를 만들고, 스레드를 종료시키고 싶을 때 
해당 클래스의 setRunningState()와 같은 메소드를 호출하면 됩니다.

주의.
위 방식으로 해도 충분히 동작하지만, 플래그 변수에 동시에 접근하는 문제가 생길 수도 있으니
플래그 변수의 type을 boolean으로 하는 대신 AtomicBoolean class를 이용하는 것을 추천합니다. 


 
댓글