오늘은 Java에서 쓰레드를 생성하고 실행하는 방법에 대해서만 알아보도록 하겠습니다. Runnable을 매개값으로 하는 Thread 생성자를 호출하거나, 아니면 worker가 Thread를 상속하는 방법 2가지가 있는데요. 이 둘을 먼저 알아보도록 하겠습니다.

 

 


Main도 하나의 실행 흐름이다.

 코드를 컴파일 하고 실행을 합니다. static void main(String args[]); 이 친구가 있는데요. 이 친구를 실행하고 종료하는 쓰레드를 메인 쓰레드라고 합니다.

 

 

worker 쓰레드

 

 그런데, worker를 하나 더 만들 수 있어요. 즉, Main 실행 흐름만 만드는 것이 아니라, 다른 역할을 하는 스레드 또한 만들 수 있는데요. 예를 들어서, Main에서 게임의 전체적인 알고리즘 같은 것을 수행한다면, Worker에서 배경 음악을 재생한다던지. 그런 식으로 처리할 수 있어요.

 

 


 프로그램 1을 봅시다.

 

 

Runnable을 implements 해서 구현한 worker

 Runnable을 implements를 했는데요. 여기에는 run() 메소드가 하나 정의 되어 있어요. 이 메서드를 재정의 해야 하는데요. 저는 run 함수에서, 쓰레드 번호를 출력하게끔 만들었습니다.

 

 

 그리고, Thread 객체를 만들어서 실행시키는 방법이 있는데요. worker가 Runnable 객체이기 때문에, Thread의 생성자의 인자로 넘길 수 있어요. 24번째 줄은, i번째 worker가, 어떻게 실행을 할 것인지 정보만 넘겨주었습니다. 즉, 쓰레드 객체가 생성만 된 상태입니다.

 

 25번째 줄에서, start() 메서드를 호출했는데요.

 

 

 이 때, 바로 실행이 되는 것이 아니라, 실행 대기 상태에 들어갑니다. 들어간 상태에서, 스케쥴러에 의해서, Thread i가 선택이 되면, 그제서야 i번째 쓰레드가 실행이 되는데요.

 

 

프로그램 1의 실행 흐름

 이 때 Runnable 객체에서 작성한 run()이 수행이 됩니다. run이 다 수행되고 나면, 쓰레드가 종료되게 되는데, 이를 종료 상태가 되었다고 합니다. 쓰레드의 state에 대해서 언급할 때 다시 이야기 하도록 하겠습니다. worker가 어떤 일을 수행하게 만들었나요? 저는 worker의 번호만 println으로 출력하고 종료하게끔 했어요.

 

 

 실행 결과를 봅시다. 0번, 4번, 3번, 2번, 1번 순으로 출력이 되었습니다.

 

 

 또 실행을 시켜 보았는데요. 이번에는 1번, 2번, 0번, 4번, 3번 순으로 출력이 되었습니다. 결과가 다르다는 것을 알 수 있어요. 당연한 것이, start() 메서드를 호출했을 때, 대기 Queue에 스레드를 넣은 것 뿐이거든요. 어떤 스케쥴링 알고리즘을 쓰는지에 따라서, 실행 순서가 바뀔 수 있을 거에요. 이 부분은 짚고 넘어가시면 좋을 듯 싶네요.

 

 


 Runnable을 implements 해서 worker를 구현하는 방법이 있다면, Thread를 extends 하는 방법이 있어요. 즉, 쓰레드의 하위 클래스로부터 생성하는 방법이 있는데요. 역시 이것도 코드로 봅시다.

 

 

Thread를 상속받아서 구현한 worker

 다른 건 없어요. 다만, Thread 클래스에도, run 메소드가 있기 때문에, 저는 worker에 맞게 run()을 재정의, 즉 오버 라이딩만 하면 됩니다. 역시, 번호를 받아서, 그 번호를 출력하게끔 했어요.

 

 

 다음에, Thread 객체 배열을 선언한 다음에, 여기에 worker 객체를 넣었는데요. worker가 Thread를 상속 받았기 때문에 가능합니다. 이를 다형성이다. 라고 이야기 하는데, 개가 동물이라는 특성을 상속 받았다면, 동물은 개가 아니지만, 개는 동물이기 때문에, 저런 식으로 대입하는 것도 가능한 셈입니다.

 

 25번째 줄에서 start() 메소드가 호출되면 마찬가지로 실행 대기 큐에 있다가, 스케쥴러에 의해서 i번째 작업자가 선택이 되었을 때, 그림과 같이 수행이 될 거에요.

 

 

프로그램 2의 실행 흐름

 실행 결과만 볼까요?

 

 

 1, 0, 3, 2, 4 순으로 출력이 되었습니다.

 

 

 그리고 이 때에는 0, 1, 3, 2, 4 순서대로 출력이 되었습니다. 역시, 마찬가지로 스케쥴러가 대기 큐에 있는 스레드들 중 어떤 것을 먼저 선택하느냐에 따라서, 달라질 수도 있어요. 그것만 조심하시면 이해하시는데 큰 문제는 없을 듯 싶네요.