Java (자바)

[Java] Thread (3) - 스레드 정지, 멈춤, 제어 / stop(), interrupt()

Oscar:) 2022. 7. 8. 22:02

 

지난 포스팅에서,

스레드의 개념과 멀티 스레드의 사용법까지 공부해 보았다.

 

이번 시간에는,

동작 중인 스레드를 정지시키는 방법에 대해 포스팅한다.

 

 


 

짧은 시간 진행되는 스레드가 아닌,

특정 조건이 이루어질 때까지 지속되는 스레드의 경우가 있을 것이다.

 

 

특정 조건에 부합할 때마다,

스레드를 죽였다 살렸다 할 줄 알아야 된다는 말이다.

 

자신이 작성한 코드를 제어할 줄 모른다는 게,

얼마나 부끄러운 일인가.

 

그렇기에 우리는 스레드를 통제할 수 있어야 한다.

 

 

stop() 메서드

 

지난 포스팅에서 사용하였던 예제를 그대로 사용하겠다.

 

 

Play.java

 

코드를 간단하게 요약하자면,

1을 입력하면 스레드가 stop() 되도록 작성하였다.

 

 

하지만..?

코드에 줄이 그어져 있는 것을 확인할 수 있다.

 

그렇다...

stop() 메서드는 deprecated 되었다.

 

*deprecated : 더 이상 사용되지 않는, 추천 되지 않는

 


한때는 Thread 클래스에서,

스레드를 즉시 정지시키기 위해 제공했던 메서드이다.

 

하지만 지금은, 안정성의 문제로 deprecated 되었다.

 

stop() 메서드로 즉시 정지시키면,

사용중이던 데이터 손실의 가능성이 생긴다고 한다.

 

 

deprecated 된 문법들은 사용하지 않는 것을 추천한다.

지금 당장은 동작하더라도,
언젠가는 프로그램 내에서 아예 삭제되어버릴 수도 있다.

그때가 되어서야,
'왜 잘 돌아가던 프로그램이 에러가 터지지?'
하면 이미 늦었다.

stop() 메서드를 포함한 모든 문법에 있어서
deprecated 된 순간, 대체할 수 있는 다른 방법으로
코드를 변경해주어야 한다.

 

 

 

그렇다면 우리는..

스레드를 어떻게 통제할수 있을까?

 

 

interrupt() 메서드

 

마찬가지로,

지난 포스팅에서 사용했던 예제이다.

 

stop() 대신 interrupt() 메서드를 사용해주었다.

 

 

Play.java

import java.util.Scanner;

public class Play {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		Timer timer = new Timer();
		
		int input;
		
		timer.start();
		
		input = scan.nextInt();
		
		if (input == 1) {
			
			timer.interrupt(); // 여기
			
		}
		
	}

}

 

마찬가지로, 코드를 요약하자면

1을 입력하면 스레드가 interrupt() 되도록 작성하였다.

 

 

출력 결과는 다음과 같다.

 

1을 입력하였더니,

에러 코드를 내뿜으며 스레드가 정지되었다.

 

 

그런데, 이 interrupt 라는 단어를 어디선가 본 것 같지 않은가?

 

 

지난 시간에 배웠던 try / catch 문의

InterruptedException 에 포함된 단어였다.

catch 문

 

e.printStackTrace() 코드 덕분에

interrupt 된 내용이 출력된 것이다.

 


 

해당 부분을 주석처리하고,

텍스트를 직접 추가해 보겠다.

 

 

출력 결과는 다음과 같다.

 

원하는 텍스트 출력과 함께,

스레드가 정지된 것을 확인할 수 있다.

 

 


타이머 정지, 재시작

 

그렇다면 이번에는,

타이머를 정지시킴과 동시에 다시 시작시켜 보겠다.

 

 

Play.java

import java.util.Scanner;

public class Play {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		Timer timer = new Timer();
		
		int input;
		
		timer.start();
		
		input = scan.nextInt();
		
		if (input == 1) {
			
			timer.interrupt();
			
			timer = new Timer(); // timer 초기화
			timer.start();
			
		}
		
	}

}

 

timer 객체를 interrupt() 한 뒤에, 곧바로

timer 객체를 초기화 시켜주고, start() 해주었다.

 

 

여기서 알 수 있는 스레드의 특징이 있는데,

한번 종료된 스레드는 다시 사용할 수 없다.

다시 사용하려면 객체를 재생성 & 초기화 해주어야 한다.

 

 

 

출력 결과는 다음과 같다.

 

성공적으로 출력된 것을 확인하였다.

 

1을 입력했을 때, interrupt 되면서 종료되었고,

곧바로 재시작하였다.

 

 


 

 

3차례 포스팅에 걸쳐서 스레드에 대해 공부해 보았다.

 

그만큼 중요한 개념이자,

자주 사용되는 코드이기 때문에 아깝지 않은 시간이었다.

 

 

오늘 공부한 스레드의 interrupt() 와,

지난 시간에 공부했던 isAlive() 함수를 통해서,

이제 웬만큼은 스레드를 의도한 대로 제어하며 사용할 수 있을 것이다.