안드로이드 쓰레드 종료를 위해
Thread.stop(), Thread.suspend() 다 해보았지만 모두 deprecated 되어서 사용하면 안될 뿐더러, 정상 동작 하지도 않는다.

그럼 남은건 interrupt() 하나 뿐인데.. 이걸 쓴다고 해서 쓰레드가 바로 종료되는건 아니더라..
보니까 interrupt() 쓴다고 쓰레드가 그냥 죽는게 아니고 쓰레드 내부에 직접 구현을 해줘야 했다.

중복 쓰레드 실행 시 이전 쓰레드를 죽이는 것도 처음에 boolean 변수 만들어서 죽여주는 그런 방법으로 시도했다가, interrupt()와 interrupted()를 활용 하는 것이 훨씬 간결 하다는 것을 알았다.

구현 소스는 다음과 같다.

public class ThreadKillDemo extends Activity {
	
	private int i = 0;
	Thread threadTest;
	
	@Override
	public void onStop(){
		super.onStop();
		if(threadTest != null && threadTest.isAlive())
			threadTest.interrupt();
	}
	
	@Override
	public void onResume(){
		super.onResume();
		i = 0;
	}
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btnTest = (Button)findViewById(R.id.btn_thread_start);
        btnTest.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {

				if(threadTest != null && threadTest.isAlive()) //반드시 null검사를 선행해야 한다. ※앞의 값이 false면 후행 검사는 하지 않는다.
					threadTest.interrupt(); //Thread를 interrupt 한다.
				i++;
				threadTest = new Thread(new Runnable() {
					
					@SuppressWarnings("static-access")
					public void run() {
						int j = i;
						while(!threadTest.interrupted()){ //interrupted 부분을 구현해준다. interrupt 호출 시 interrupted는 true 반환.
							SystemClock.sleep(1);
							Log.i("THREADKILL","WORKING "+j);
						}
					}
				});
		        threadTest.start();
			}
		});
              
        Button btnNext = (Button)findViewById(R.id.btn_next);
        btnNext.setOnClickListener(new View.OnClickListener() {			
			public void onClick(View v) {				
				Intent i = new Intent(ThreadKillDemo.this, ActivityTest.class);
				i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				startActivity(i);
			}
		});
    }
}


p.s) interrupt 쓰는 순간 바로 스레드를 죽여보고 싶은데 그건 아무래도 힘들것 같고 적어도 루프 한번은 돌아야 죽일 수 있는 것 같다;;

p.s2) 예제에서는 다른 액티비티로 넘어갈 때 쓰레드를 죽이기 위하여 이런 식으로 구현 하였다.
저작자 표시 비영리 변경 금지
신고
블로그 이미지

roter

JHB / Peripheral Programmer

댓글을 달아 주세요

  • 감사합니다 2011.08.13 12:13 신고  댓글주소  수정/삭제  댓글쓰기

    많은 도움이 됫습니다

    • BlogIcon roter 2011.08.16 14:03 신고  댓글주소  수정/삭제

      안녕하세요~ 제 블로그에 방문해주셔서 감사합니다 :)
      이 글이 제 블로그 조회수 1위더군요 :)
      그럼 오늘도 열플밍 하시길!

  • thanks.. 2011.09.29 17:13 신고  댓글주소  수정/삭제  댓글쓰기

    onStop은 반드시 구현해주어야하나요?

    • BlogIcon roter 2011.09.30 11:20 신고  댓글주소  수정/삭제

      안녕하세요 ^^ 들려주셔서 감사합니다.
      onStop에 해당 부분 구현이 없을 경우, Activity가 종료된 이후에도 쓰레드가 살아있을 수가 있습니다. 따라서 저렇게 구현해 주시는게 좋습니다.

  • UnlimitedJava 2012.06.09 19:36 신고  댓글주소  수정/삭제  댓글쓰기

    이 방법을 사용해도 종료가 안되는 Thread가 있는데 무슨 까닭일까요?
    스탑워치 만드는 중에 시간 계산부분을 쓰레드로 돌리고 결과를 출력하는 걸 핸들러로 돌렸는데 종료 버튼 꾹~해도 쓰레드는 여전히 용감하게 돌아가는군요...

    • BlogIcon roter 2012.06.18 03:06 신고  댓글주소  수정/삭제

      안녕하세요 방문해주셔서 감사합니다 :)
      쓰레드 소스코드가 어떤식으로 돼있는지 여쭤봐도 될까요? 방명록에 올려주시면 참조하겠습니다 :D