본문 바로가기
Development/JAVA

[자바]쓰레드-Thread

by True Life 2015. 12. 19.

자바 프로그래밍 - Thread


1. 쓰레드의 정의(Thread's Definition)


사실 Java의 Thread라고 하긴 했지만 '쓰레드'라는 자체는 자바에서만 있는 개념이 아닌 프로그램의 기본적 구조에 포함되는 개념입니다.


스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다. 




위의 내용은 위키피디아가 쓰레드를 정의한 내용입니다. (스레드라네요, 그래도 저는 쓰레드로 밀어 붙일겁니다. ^오^)

저 말을 조금 더 분석 해봅시다. 프로그램 내에서, 특히 프로세스 내에서 라고 하네요?

프로그램 != 프로세스?

여기서 하나 정의하고 갈게요,


프로그램 : 소스로부터 나온 최종 목적 파일 (기계어)

프로세스 : 프로그램을 실행시켜서 현재 실행 중 일때 - 일관된 흐름(직렬)을 가짐

쓰레드 :  프로세스 실행시 메인 쓰레드가 생김, 별개로 프로그래머가 쓰레드를 만들어 개별적 동작을 진행시킬 수 있음

 - 프로세스(직렬)을 여러개 하면 멀티쓰레드로써 병렬 프로그래밍임


자 나름 깔끔하게 정리한다고 했는데 이해가시나요?

Main Thread는 최초 프로그램 실행시 만들어진 쓰레드고 이후 프로그래머가 임의로 만든 쓰레드들을 Sub Thread라고 합니다.

여기서 조금 더 명확하게 하고 가고 싶네요,

제 경우에는 쓰레드를 처음 접할때


'C언어:절차지향 == 직렬? 오호..!'

'C언어 반대(C++/JAVA..) == 병렬 프로그래밍 == 객체지향' !?!?'

'아하, 병렬 프로그래밍 == PPL == 멀티쓰레드 프로그래밍'


이라는 생각을 했습니다. 처음 배우는 입장에서 다들 할 수 있는 생각이겠죠? ^^;

그것에 관해서도 정리해볼게요~

1. 병렬 프로그래밍(PPL), 멀티쓰레드(Multi Thread) 프로그래밍

2. 절차지향(POP)과 객체지향(OOP) 프로그래밍


자, 쓰레드(Thread)의 영어 의미는 '실'입니다.

수많은 실타래들이 각자 절차를 수행한다는 의미로 떠올려보시면 될 듯 합니다^^..


2. 자바 쓰레드 이용(Using thread in Java programming)


예를 들어보겠습니다. 여기서 ThreadSample class는 Thread를 상속 받았습니다.

따라서 자체로 Sub Thread로 정의될 수 있는 class가 된 것이죠.

여기서 run은 Thread 상속에 대한 Override입니다. Thread.start시 새로운 Thread로 시작하는 메소드죠!



이 결과를 실제로 해보시면 알겠지만 main Thread는 나머지 Thread들을 생성 및 실행 후 종료됩니다.
따라서 Sub Thread의 과정을 기다리지 않는 것이죠..!


<실행결과>


* Thread.sleep() 은 매우 빈번히 사용되는 메소드입니다. 한마디로 해당 Thread는 n ms동안 대기를 하게 되죠.


3. 쓰레드 실제 활용(Practical using of Thread)


쓰레드의 활용이라고 하긴 했지만 쓰레드의 응용 분야는 셀수 없이 많아서 두 가지 정도의 예제로 이해를 돕도록 하겠습니다.



자, 간단한 타이머입니다. 이해가 가시나요? 결과는 생략하도록 하겠습니다.

자, 다음 예제를 통해서는 Thread.join() 메소드를 알아보도록 하겠습니다.
사실 최상단 예제와 똑같습니다만 test.join() 부분을 통해 ThreadSample test가 종료될 때까지 기다리게 됩니다.


여기서 start() 메소드에 대해 조금만 더 알아볼게요~


<t.start() 시 발생하는 과정>

1. 쓰레드가 작업을 수행하는데 사용할 새로운 호출스택을 생성한다.

2. 생성된 호출스택에 run()을 호출해서 작업이 수행되도록 한다.

3. 기존 호출스택과 생성 호출스택이 생겼으니 스케쥴러가 번갈아가면서 실행한다


쓰레드란 '호출스택'이 다르므로 main thread가 죽어도 생성된 thread에는 영향을 미치지 않습니다.


이렇게 쓰레드는 Main Thread와 독립된 프로세싱을 진행할 수 있다는 장점으로 게임에서의 그래픽 구현, 동시 다운로드, DB 접근등 다양한 분야에서 이용될 수 있습니다 - 추후에 포스팅해보도록 하겠습니다^^;


쓰레드 관련 추가 내용도 계속 포스팅하겠습니다!


1. [자바-Java]Runnable과 쓰레드(Thread)와의 관계

2. [자바-Java]쓰레드, 동기화(Synchronization)및 교착(Deadlock)상태