본문 바로가기

Java 공부/신용권의 이것이 자바다

스레드(Thread) 상태를 재어하는 메소드(Method)들

반응형

스레드는 공유객체를 함께 사용하는 만큼, 원할하게 작동시키기 위한 다양한 실행 메소드(Method)들이 존재한다.

다른 객체가 공유객체를 사용하는 동안 일시정지해 있거나 대기상태에 있어야 할 때도 있다.

스레드가 잘 작동하도록 하기 위해서는 다양한 제어방법을 잘 알고 활용할 줄 알아야 할 것이다.


이에 앞서 '스레드 상태'(state)를 먼저 이해할 필요가 있다.

스레드 상태에는 객체생성, 실행대기, 일시정지, 종료가 있다.

1) 객체생성(열거상수 NEW): 스레드 객체가 생성, 아직 Start() 메소드가 호출되지 않은 상태

2) 실행대기(RUNNABLE): 실행상태로 언제든지 갈 수 있는 상태

3) 일시정지(WAITING): 다른 스레드가 통지할 때까지 기다리는 상태, (TIMED_WAITING): 주어진 시간 동안 기다리는 상태, (BLOCKED):사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태

4) 종료(TERMINATED):실행을 마친 상태


아래 코드들은 스레드를 제어하는 대표적인 메소들이 적용된 예의 모습이다.

이 코드들과 함께 스레드제어 메소드와 그 역할을 소개하도록 하겠다.

 


위 코드는 Sleel() 메소드이다.

Sleep() 메소드는 밀리세컨드(1/1000)의 매개값을 갖는다.

즉, 1000이라고 쓰면 1초가 경과할 동안 일시정지 상태로 있게 된다는 뜻이다.

위 코드에는 3000이라는 매개값이 주어졌다.

이것은 3초 동안 멈췄다가 실행하라는 명령이다.

일시정지 상태에서 주어진 시간이 되기 전에 interrupt() 메소드가 호출되면 InterruptedException이 발생하기 때문에 Sleel() 메소드는 예외처리를 필요로 한다.



yield() 메소드는 실행 중에 우선 순위가 있거나 동일한 순위의 다른 스레드에게 실행을 양보하고 실행대기 상태에 있는 것을 말한다.


스레드는 다른 스레드와 독립적으로 실행하는 것이 기본이지만, 다른 스레드가 종료될 때까지 기다렸다가 실행해야 하는 경우도 있다. 

이럴 때 join() 메소드를 재공한다. 

join() 메소드를 호출한 스레드는 일시정지 상태가 된다. 

실행 대기 상태로 가려면 join() 메소드를 멤버로 가지는 스레드가 종료되거나 매개값으로 주어진 시간이 지나야 한다.

join() 메소드도 millis, nanos를 매개값으로 갖는다.



스레드 간의 협업을 위해서 wait(), notify(), notifyAll() 메소드를 호출한다.

이 메소드들은 정확하게 번갈아가며 공유객체를 실행하도록 할 때 사용한다.

그런만큼, 동기화(synchonized) 메소드나 동기화 블럭 안에서만 사용해야 한다. 

위 코드에도 wait(), notify() 메소드가 동기화(synchonized) 메소드 안에서 호출된 것을 볼 수 것을 것이다.



interrupt() 메소드도 빼놓을 수 없다.

interrupt() 메소드는 일시정지상태의 스레드에서 InterruptedException 예외를 발생시켜, 예외처리코드(catch)에서 실행대기 상태로 가거나 종료상태로 갈 수 있도록 한다.

이것들 외에 stop(), resume(), suspend() 메소드들이 있었지만, 이들은 사라졌다.


반응형