2011년 5월 15일 일요일

자바의 쓰레드(Thread)

자바의 스레드는 동시 프로그래밍의 영역에 있다고 보면 된다. 동시 프로그래밍(Concurrent Programming)이 가능하도록 만들어주는 기본 단위로 프로세스(Processes)와 쓰레드(Threads)를 들수 있는데 자바 프로그래밍에서는 쓰레드가 대부분을 차지하므로 우리도 여기에 주안점을 두고 공부할 것이다. 그만큼 자바에서 쓰레드는 핵심적인 부분 중 하나이다. 자바를 공부하는 이들 태반이 쓰레드에 대한 내용을 어려워하고 지긋지긋해 한다. 그러나 이번 강이의 자바강좌를 통해 쓰레드에 대한 기본적인 원리를 확실하게 깨우치고나면 쓰레드가 더이상 여러분을 가로막는 산이 아니라 함께 할수 있는 동반자가 될 것이라 확신한다. 진도는 천천히 충분한 시간차(?)를 두면서 나아갈 생각이니 미루지 말고 주어지는 내용과 예제는 반드시 그날 그날 마스터하도록 하자.^^

프로세스(Process): 컴퓨터에서 연속적으로 실행되고 있는 프로그램을 말하는 것으로 여러개의 프로세서를 사용하면 멀티프로세싱이고 여러개의 프로그램을 같은 시간에 시분할 방식으로 돌리면 멀티태스킹이라 말한다.

쓰레드(Thread): 프로세스내에서 실행되는 흐름의 단위를 말하는 것으로 하나의 프로그램은 최소한 하나의 쓰레드(main thread)를 가진다. 프로그램에 따라 둘 이상의 쓰레드를 동시에 실행할수 있는데 이를 멀티쓰레드라고 부른다.

위에 설명한 것은 보편적으로 하는 얘기라 잘 와닿지 않을테니까 보다 쉽게 설명해 보기로 하겠다. 여러분이 프로그램을 하나 만들었는데 그게 동영상 플레이어라고 치자. 그런데 영상과 동시에 그와 관련된 영상 제목과 줄거리를 영상화면 밑에 자막으로 나오는 기능을 넣고 싶다면 어떻게 프로그램을 짜야될까? 영상을 플레이하는 기능과 영상에 관련된 문서를 디스플레이하는 기능, 이 두가지를 동시에 실행하도록 만들어야할 것이다. 이럴때 우리는 쓰레드가 필요한 것이다. 지금 컴퓨터나 그외 기기로 이 글을 읽으면서 음악같이 듣는 것도 마찬가지라 할수 있겠다. 즉 하나의 프로그램에서 동시에 두개 이상의 일을 수행할 필요가 있으면 쓰레드를 이용하면 된다. 쓰레드는 경량 프로세스(lightweight processes)라고 불리기도 하는데 쓰레드가 프로세스에 비해 리소스를 덜 잡아먹고 더 효율적이다.

지금까지 우리는 프로그램을 짜면서 쓰레드를 전혀 사용하지 않았다고 생각할지 모르겠지만 우리가 직간접적으로 상속받고 쓰는 클래스들의 내부에 보편적으로 쓰레드 기능이 작동하고 있기 때문에 우리가 눈으로 확인이 불가능했을뿐 자바에서 알아서 처리해 주고 있었다고 생각해도 무방하다. 우리가 흔히 써왔던 메인메소드를 메인쓰레드라 생각하면 이해가 쉬울 것이다. 바로 이렇게 자바에서 밀접하게 활동하고 있는 쓰레드를 우리가 직접 제어하고 작업스케줄을 만들어 프로그래머의 통제하에 움직이도록 만드는게 이번 강좌의 목표라 할수 있겠다.


지금부터 쓰레드를 사용하는 방법을 예제를 통해 살펴보기로 하겠다. 쓰레드를 만들고 실행시키려면 run( )이라는 메소드를 오버라이드해서 사용해야 한다는 규약이 있다. 또한 이 run( )이라는 메소드를 작동시키기 위해서 start( )라는 메소드로 작업지시를 해서 run( ) 메소드를 실행하게 만들어야 쓰레드가 작동된다. 예제는 간단한 메시지를 화면에 출력하는 것인데 이미 강좌 초반에 했던것과 결과는 별반 다름이 없을 것이다. 허나 결과는 같더라도 우리는 쓰레드를 이용해서 화면에 메세지를 출력했다는게 이번 장의 핵심이다. 쓰레드를 이용해서 화면에 메세지를 출력하는 예제인데 두가지 방법이 있다. 둘다 java.lang 패키지에 속해있는데 하나는 Runnable이라는 인터페이스를 구현하는 방법이고 다른 하나는 Thread라는 클래스를 상속받아서 쓰레드를 작동시키는 두가지 방법이 있다. Thread 클래스도 Runnable 인터페이스를 구현(implements)하고 있는데 차례대로 어떻게 쓰는지 예제를 보면서 공부해 보기로 하자.


Runnable을 통해 쓰레드를 실행하였습니다

Runnable이라는 인터페이스를 구현하는 예제인데 아까 언급했듯이 인자가 없는 run( ) 메소드를 위처럼 오버라이드해야 한다. 메인메소드에서 쓰레드를 만들고 실행시키기 위해 자체 클래스의 인스턴스를 생성해서 쓰레드 객체생성할때 인자로 넣어주고 쓰레드를 시작하라는 start( ) 메소드를 작동시키는 예제이다. 실행결과는 딸랑 한줄이지만 여러분은 쓰레드를 이용해 작업지시를 내렸다는데 의의(?)가 있다고 하겠다. Thread 클래스가 없는데 난데없이 튀어나와서 이해가 안되는 이가 있을지 모르겠는데 방금전에 java.lang 패키지에 들어있다고 했다. 그래서 쓸수 있는 것이다.ㅎㅎ 이해가 잘되지 않는다면 강좌초반에 설명한 import 부분에 대해서 살펴보면 알겠지만 자바는 자주 쓰이는 기본 클래스에 대해서는 특별히 가져오지 않더라도 쓸수 있도록 배려(?)를 해놓았다. Thread가 이에 속하니 그 중요성을 잠시나마 실감했길 기대한다.^^

그럼 이번에는 Thread라는 클래스를 직접 상속받아서 쓰레드를 만들고 실행해 보기로 하겠다.


Thread를 통해 쓰레드를 실행하였습니다

결과는 위랑 다를게 없다. 다만 인터페이스로 구현해서 간접적으로 Thread 클래스를 사용하느냐 아니면 Thread를 위처럼 직접 상속받아서 쓰레드를 작동하느냐의 차이다. 쓰레드를 작동시키기 위해 아까처럼 start( ) 메소드로 지시하면 run( ) 메소드가 지시받아서 쓰레드를 작동시킨다. 코드가 이게 조금이라도 줄어서 보기 편하기는 하지만 자바에서는 다중상속이 안되므로 이 클래스는 더이상 다른 클래스를 상속받아 쓸수 없는 단점이 있다. 그렇지만 그전 예제는 인터페이스라 다른 클래스를 상속받아 쓸수 있으므로 보통 Runnable을 쓰는게 일반적이다.

오늘은 워밍업(?) 단계로 자바의 쓰레드를 어떻게 만들어서 동작시키는지만 알아보았다. 쓰레드가 눈에 보이는게 아니므로 내용의 난이도를 떠나서 그냥 막연하게 느껴질 것이다. 너무 자연스러운 현상이니 걱정하지말고 본 내용만이라도 확실하게 숙지하고 차근차근 따라오면 여러분은 어느 순간에 쓰레드에 대해서 능수능란하게 논할수 있는 자바 프로그래머가 되어 있을 것이다. 정말? 복습이라도 철저히 한다면 말이다.^^

댓글 13개:

  1. 저 폭풍감동 눌렀어요

    답글삭제
  2. 읽은 소감 : 재미있어요.

    답글삭제
  3. 잘봤습니다 ㅎㅎ

    답글삭제
  4. 강좌 내용이 정말 후덜덜하게 재미있습니다. 안드로이드를 업무 때문에 스터디 하고 있는데요. 이 블로그 내용이 알차고 정말 읽어 볼 만한 글 많군요. ^^ 감사합니다.

    답글삭제
  5. 좋으다좋으다 너무 좋으네요 쓰레드 부분은 항상 헷갈렸는데 알찬 내용 이였어요^^

    답글삭제
  6. Somebody essentially assist to make critically posts I might
    state. This is the first time I frequented your web page and so
    far? I amazed with the analysis you made to create this particular post incredible.
    Great task!

    Feel free to visit my web site cellulite treatment

    답글삭제
  7. 감사하게 잘 읽었습니다 ^^

    답글삭제
  8. 진짜 감사합니다. 잘 읽었습니다.

    답글삭제
  9. 감사합니다. 이제까지 본 스레드 설명 중에 제일 친절하면서도 간단했어요ㅜㅜ 덕분에 막연했던 느낌에서 좀 벗어난 것 같아요!

    답글삭제