12-2 스레드 제어

지미미·2023년 4월 18일
0

Java

목록 보기
11/16
post-thumbnail

스레드 상태

스레드를 생성하고 시작하면 스레드는 다양한 상태를 가지게 된다. 스레드의 상태는 자동으로 변경될 수도 있고, 코드에 의해서 변경될 수도 있다.

  • 실행 상태(running)
    실행 대기 상태에 있는 스레드 중에서 운영체제는 하낭듸 스레드를 선택하고 CPU(코어)가 run()메소드를 실행하도록 한다.

  • 종료 상태(terminated)
    실행 상태에서 run()메소드가 종료되면, 더 이상 실행할 코드가 없기 때문에 스레드의 실행은 멈추게 된다.

일시 정지

실행 중인 스레드를 일정 시간 멈추게 하고 싶다면 Thread 클래스의 정적 메소드인 sleep()을 사용하면 된다. 다음과 같이 Thread.sleep() 메소드를 호출한 스레드는 주어진 시간 동안 일시 정지 상태가 되고 다시 실행 대기 상태로 돌아간다.

안전한 종료

Thread는 스레드를 즉시 종료하기 위해서 stop() 메소드를 제공하고 있는데, 이 메소드는 deprecated(중요도가 떨어져 이제 사용되지 않음)되었다. 그 이유는 stop() 메소드로 스레드를 갑자기 종료하게 되면 스레드가 사용 중이던 자원들이 불안전한 상태로 남겨지기 때문이다. 스레드르 안전하게 종료하기 위해서 stop 플래그를 이용하거나 interrupt() 메소드를 이용하는 방법이 있다.

  • 스레드 상태 제어
  1. interrupt()
    일지 정지 상태의 스레드에서 InterruptedException을 발생시켜, 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다.
    ※ 스레드가 일시 정지 상태가 되지 않으면 해당 메소드 호출은 아무런 의미가 없다.
  2. sleep(long millis)
    주어진 시간 동안 스레드를 일시 정지 상태로 만든다. 주어진 시간이 지나면 자동적으로 실행 대기 상태가 된다.
  3. stop()
    Thread 클래스의 정적 메소드로서 스레드를 즉시 종료한다. 불안전한 종료를 유발하므로 사용하지 않는게 좋다.

데몬 스레드

주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다. 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료되는데, 주 스레드의 보도 역할을 수행하므로 주 스레드가 종료되면 데몬 스레드의 존재 의미가 사라지기 때문이다.

스레드를 데몬으로 만들기 위해서는 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출해주면 된다. ※ 주의할 점은 start() 메소드가 호출되고 나서 setDaemon(true)을 호출하면 IllegalThreadStateException이 발생하기 때문에 start() 메소드 호출 전에 setDaemon(true)를 호출해야한다는 것이다.

public static void main(String[] args) {
		AutoSaveThread thread = new AutoSaveThred();
		thread.setDaemon(true);
		thread.start();
		...
	}
profile
블루라이트로 광합성 하는 새럼

0개의 댓글