brunch

You can make anything
by writing

C.S.Lewis

멀티스레드 - 스레드의 개념

* 이 내용은 철저히 초심자를 위해 알기 쉽게 설명하는 것을 목적으로 하고 있습니다.

* 더 정확하고 자세한 개념은 다른 고수님들의 글들을 참고하시길 바랍니다.

* 그리고 이 글에서는 코드 최소한으로 다루고 있습니다.


프로그래밍에서 스레드에 대해 안다는 것은 프로그램을 움직이는 어떤 근본적인 힘에 대해서 안다는 것입니다. 즉, 스레드는 프로그램을 움직이는 원동력입니다. 

이번엔 그 스레드에 대해서 알아볼까 합니다.


일반적으로 우리는 프로그램의 실행 단위를 프로세스로 알고 있습니다. 즉, 프로세스는 프로그램을 실행하고 있는 단위라는 것이죠. 그럼 스레드와 프로세스의 차이는 무엇일까요?


스레드와 프로세스

프로세스는 프로그램의 실행 단위이며, 스레드는 프로세스 안에서 일을 한다고 생각하면 쉽습니다.

그래서 한 프로세스 안의 스레드들 간에는 자원(메모리)을 공유할 수 있습니다.

하지만 프로세스 간에는 서로 다른 영역 이므로 자원(메모리)을 공유할 수는 없습니다.

가만히 생각해 보면 메모장이라는 프로그램과 엑셀이라는 프로그램은 서로의 상태도 알 수 없을뿐더러, 글의 내용 등을 공유할 수도 없습니다. 서로 다른 프로세스 이기 때문이죠!


스레드라는 친구는 프로그램을 위해 열심히 일해주는 일꾼이라고 생각하면 됩니다.

그런데 이 스레드는 혼자 일 할 수도 있지만 자신을 위해 일(work)해줄 스레드를 만들어 낼 수 있습니다.

분신술을 사용할 수 있다는 것이죠! 이 분신들을 나를 위해 일해 준다는 의미로 Work Thread라고 부릅니다. 그리고 이 분신들을 여러 개를 생성하여 동시다발적으로 일을 시킬 수 있습니다.


Thread 사용 법

Thread를 복사하여 Work Thread를 생성하기 위해서는 지켜야 할 규칙이 있습니다.

첫 번째는 Runnable 인터페이스를 구현받거나 Thread 클래스를 상속받아야 한다는 것입니다.

두 번째는 오버라이드 한 run이라는 메서드 안에 해야 할 일을 적어야 합니다.


세 번째로 스레드를 생성 후 해야 할 일을 넣어주고 start() 메서드를 실행해 주어야 합니다.

이때 Runnable 인터페이스를 구현받은 객체와 Thread 클래스를 상속받은 객체의 실행 방법이 조금 다릅니다. 

그 이유는 ‘상속’이라는 개념을 떠올려보면 당연한 건데요. 

Thread를 상속받은 Job 클래스는 Thread의 기능을 자기 것처럼 사용할 수 있습니다.  그리고 자신의 코드 안에 해야 할 일이 있기에 객체화 만으로 해야 할 일을 스레드에 넣는 행위를 한 것이나 마찬가지가 됩니다. 안에 스레드의 기능도 있고, 해야 할 일도 있기 때문이죠!


이렇게 만들어진 work thread는 main thread 와는 별개로 움직이게 됩니다.

이게 단순한 이야기로 들릴 수 있겠지만 알고 보면 머리 아픈 문제를 많이 일으키곤 합니다.

위에 보이는 세 개의 스레드는 순차적으로 움직이지 않습니다. 그렇기 때문에 발생할 수 있는 문제를 한번 보도록 하죠!


예를 들어 세 개의 스레드가 3,6,9 마다 박수를 치는 게임을 한다고 가정해 보겠습니다. 

그럼 위에서부터 그림처럼 이루어질 거라 예상할 수 있습니다.


그런데 막상 보면 세 개의 스레드는 순차적으로 움직이지 않습니다. 마치 눈치 게임 하듯이 말이죠.

이렇게 순서 없이 제멋대로인 이유는 스레드 동작 방식 때문입니다.


Round Robin 방식

Round Robin 방식은 먼저 일을 끝낸 스레드가 다음일을 받아서 처리하는 방식입니다.

이어 달리기를 생각하면 이해가 쉽습니다.

첫 번째 주자가 1등으로 들어왔다고 해서 두 번째 주자도 1등으로 들어오라는 법은 없죠!

그때그때 빠른 사람이 1등을 하게 됩니다. 스레드 역시도 그때마다 먼저 처리된 스레드가 누가 될지 모르기 때문에 순서에 무작위 성이 생기게 됩니다.


이렇게 예측 불가능 하게 통통 튀는 스레드들은 동시다발적으로 일을 처리해 주기에 유용하지만, 제어하는 게 쉽지는 않습니다. 그래서 이 스레드들을 제어하는 여러 방법들이 등장하게 됩니다.

여러 방법이 있지만 우리는 비교적 쉽고 확실하게 제어할 수 있는 방법 몇 가지만 알아보도록 하겠습니다.

매거진의 이전글 JAVA I.O. - 보조스트림
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari