Java - Thread(1) : Basic

Junburg
3 min readFeb 10, 2018

--

먼저 프로세스쓰레드의 관계에 대해서 알아보겠습니다.

프로세스는 ‘실행되고 있는 컴퓨터 프로그램’을 말합니다. 프로그램을 실행하게 되면 운영체제로부터 필요한 메모리를 받아 프로세스가 되는 거죠. 그리고 이 프로세스가 가진 메모리를 가지고 실제로 작업을 하는 녀석이 쓰레드입니다. 그런데, 우리가 프로그램을 사용하다 보면 한가지 작업만 하지 않습니다. 흔히 사용하는 카카오 톡을 예로 들면, 채팅하면서 동시에 상대방이 보낸 파일을 다운로드 받죠. 이것은 하나의 프로세스(카카오톡) 안에서 여러 개의 쓰레드를 만들 수 있고, 생성한 쓰레드들을 가지고 여러 가지의 작업(파일 다운로드, 채팅)을 수행할 수 있기 때문에 가능합니다.

프로세스와 스레드

이렇게 여러 쓰레드로 여러 작업을 동시에 처리하는 것을 멀티 쓰레딩(multi-threading)이라고 부릅니다. 멀티 쓰레딩은 CPU의 사용률을 향상시키고, 자원을 효율적으로 사용할 수 있습니다. 또한, 사용자에 대한 응답성이 향상되죠. 그렇다면 멀티 쓰레딩은 장점만 가지고 있을까요? 당연히 아닙니다. 프로세스의 자원을 공유하며 작업하기 때문에 동기화나 교착상태와 같은 문제들이 발생할 수 있기 때문이죠. 쓰레드를 잘 쓰기 위해서는 이러한 문제들을 고려해가며 프로그래밍 해야 합니다. 이에 대해서는 포스트를 진행하면서 천천히 알아보겠습니다.

자바에서 쓰레드를 구현하는 방법에는 2가지가 있습니다.
1. Thread클래스를 extends
2. Runnable인터페이스를 implements
상속은 하나만 받을 수 있기 때문에 Runnable인터페이스를 사용해서 쓰레드를 구현하는 것이 좋다고 합니다.

쓰레드 구현 방식

위의 코드를 실행했을 때 출력 결과는 다음과 같습니다.

출력 결과

의문이 가는 점은 왜 run()이 아닌 start()를 호출할까요? 모든 쓰레드는 독립적인 작업을 수행하기 위해 자신만이의 호출 스택이 필요합니다. 쓰레드가 생성되고 실행될 때마다 새로운 호출 스택이 생성되고 쓰레드가 종료되면 함께 소멸됩니다. 아래 그림은 그 과정을 그린 것입니다.

쓰레드의 호출 스택 생성
  1. main메서드가 start()를 호출합니다.
  2. 새로운 쓰레드가 생성되고 쓰레드의 작업을 위해 새로운 호출 스택을 생성합니다.
  3. 독립된 호출 스택에서 run()이 호출 되어 쓰레드가 작업을 수행합니다.
  4. 스케줄러가 정한 순서에 따라 호출 스택 2개가 번갈아 가며 실행됩니다.

알아 두셔야 할 것은 main메서드의 작업을 수행하는 것도 쓰레드입니다. 그러므로 하나의 프로그램에는 하나 이상의 쓰레드가 존재하는 셈이죠.

다음 포스팅에서 쓰레드에 관해 더 알아 보겠습니다.

  • 참고자료: 자바의 정석(남궁석)

--

--