앱 만들기/안드로이드

쓰레드 중지 시키기.

나도 처음이야 2022. 6. 3.

쓰레드를 가장 안정적으로 중지시키는 방법은

쓰레드 내 반복문의 플래그를 false 로 바꾸어 run() 메소드가 정상적으로 실행을 마치게 하는 것이다.

@Override
	public void run() {
		while(isRepeat = true){ //isRepeat 변수를 false 로...  
			System.out.println("쓰레드 동작 중");
			}

하지만, Thread 의 interrupt() 함수로 강제 exception 을 발생시켜 동작중인 쓰레드를 정지시킬수 있다.

public class ControlThread {

		public static void main(String[] args) {
			Thread th2 = new Thread(new Thread2());	
			th2.start();
			//인터럽트 발생시킴.
			th2.interrupt();
		}	
}

class Thread2 implements Runnable{

	@Override
	public void run() {
		while(true){			
			if(Thread.interrupted() == true) {
				System.out.println("인터럽터 발생함");
				break;
			}			
		}
		
		System.out.println("쓰레드 종료");		
	}

}

Thread.interrupted() 함수를 통해서 interrupt() 함수가 호출되었는지에 대해서 알수 있다.

현 상태가 interrupt() 콜 호출된 상태, 즉 interrupt exception 이 발생하였다면 

해당 함수블럭을 실행시키고 break; 를 통해 반복문을 빠져나오게 된다.

 

interrupted() 함수를 사용하지 않고도 구현이 가능하다.

바로 하기처럼, 쓰레드 sleep() 으로 대기 상태를 걸어주면 된다.

메인 쓰레드에서 interrupt() 함수를 호출한다고 해서 바로 인터럽트가 걸리는 것이 아니다.

인터럽트는 쓰레드가 동작중일때가 아닌 일시정지 상태일때 걸리기 때문에 sleep() 함수를 주고 그 순간 인터럽트가 발생하면 exception 에 의해서 반복문을 빠져나오도록 구현했다.

class Thread2 implements Runnable{

	@Override
	public void run() {
		try {

			while(true) {
				System.out.println("쓰레드 동작중 ");
				Thread.sleep(1);
				}	
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
				System.out.println("쓰레드 중지 ");
				
			}					
		}		
	}

감사합니다.

반응형

댓글