2011년 5월 20일 금요일

다중스레드(Multi-thread)


자바 프로그램내에서 두개 이상의 쓰레드를 돌릴때 부르는 다중쓰레드 혹은 멀티쓰레드에 대해서 공부해 보기로 하자.  도표에서 보듯이 각 쓰레드에 대한 명령을 일정시간 돌아가면서 실행하여 유저 입장에서는 그것이 동시에 실행되고 있는듯이 보이게 된다. 즉 한 프로그램내에서 각각의 다른 프로그램들이 동시에 개별적으로 움직이듯이 만드는 이와 같은 멀티쓰레드 형태를 자바가상머신(JVM)에서는 허용하고 있다.


방금 언급하였듯이 동시 프로그래밍이라고 하지만 내부적으로는 이것 작동했다가 저것 작동했다가 왔다갔다하면서 쓰레드 내부에 있는 작업 스케줄러가 암암리(?)에 상황따라 각 쓰레드를 일정시간 작동시키고 있는 것이다. 여러분이 워드를 치고 있다고 가정할때 프린트 명령을 쳐놓고 계속 작업할때도 있을테고 아니면 스펠링 체크를 명령한후 안에서 계속 다른 작업을 할수도 있을 것이다. 자바로 따지면 이런 것이 가능한 것은 하나의 프로그램이지만 각각의 쓰레드가 동시간대에 움직이며 서로 리소스를 공유하면서 실행하기에 이런 동시작업이 가능해진다. 엄밀히 따지면 작업들을 쓰레드별로 쪼개서 담당 처리한다고 생각해도 무방할 것이다.

지금까지 필자가 한 얘기를 못알아들었다면 싸그리 잊어버려도 좋다. 이제부터 아주 직접적이고 단순하게 설명하겠다. 자바에서 다중쓰레드는 말그대로 쓰레드가 두개 이상 즉 여러개 움직이는 것을 말한다. 필자가 보여줄 예제는 0부터 100까지 카운트하는 프로그램이다. 쓰레드를 세개 만들고 돌리는데 각각의 쓰레드가 하나의 프로그램인양 0부터 100까지 카운트하기 시작한다. 예제를 실행해보면 알겠지만 실행순서는 쓰레드1, 쓰레드2, 쓰레드3 이렇게 순서대로 실행된다. 그러나 순서대로 실행되지 않고 무작위로 어떤 것이 실행될지 모를뿐더러 어디까지 세고 나중에 다시 셀지도 알수 없다.

프로그램을 실행할때마다 다른 결과값이 나오니 상당히 의아해할지 모르나 다중쓰레드의 개념을 익히기에 부족함이 없으면서도 아주 단순한 예제니 어렵지 않을 것이다. 빠른 이해를 위해서 각 쓰레드별로 이름을 달아놓았고 각 쓰레드의 우선순위가 무엇인지 출력하라고 해놓았다. 예제에서 쓰인 getName( ), setName( ), getPriority( ) 같은 메소드들은 자바 API를 보면 알겠지만 전부 Thread 클래스안에 있는 것들이다. 상속을 받았으니 편안하게 불러쓰고 있는 것인데 모르는 이는 없으리라 본다. 실행해보면 알겠지만 우선순위는 모든 쓰레드가 다 똑같다. 즉 확인한 우선순위 값에서 보듯이 동시에 작업한다고는 하나 자원은 한정되어 있고 처리는 동시에 하라고 하니 이것저것 실행하면서 같이 작업하는 것처럼 보이도록 무난히도 애쓰는 모습(?)이 역력한 것이다.^^


아마 이 프로그램을 보고 그럼 순서대로 쓰레드를 작동하게 만들고 싶으면 어떻게 해야되냐는 의문을 가지는 이가 생길 것이다. 어떻게 만드는지는 여러분이 저번 시간에 이미 배웠다. 기억이 안난다면 여러분 자신의 조인트(join( ))를 알아서 까기 바란다.ㅎㅎ 배운데로 했는데도 안되는 이들은 예외(InterruptedException)없이 조인트를 한번 더 까기 바란다.^^ 오늘 배운 멀티쓰레드는 그냥 예제를 돌려보면 어떤 것인지 알게 될것이다. 단 세번 이상 돌려봐야 이런 것이 멀티쓰레드구나 이해될 것이다. 결과를 비교해보면서 잠시 명상(?)을 취해보기 바란다.^

댓글 4개:

  1. This is a topic that's near to my heart... Thank you! Where are your contact details though?

    Review my webpage - best cellulite treatment

    답글삭제
  2. 와.. 정말 공부하는데 도움이 되는 주옥같은 강의네요.
    개인적으로 연락좀 하고싶은데 혹시 이 댓글 보신다면
    lindomain@nate.com 네이트 친추좀 부탁드릴게요.

    답글삭제
  3. 명상까지 마치고...^^ 댓글 씁니다. 말씀하신 대로, 각 인스턴스의 start() 다음 행에 join()을 각각 넣어 봤는데.. 세개를 다 넣으니 순서 대로 실행이 되더군요. 그런데.. 한 쓰레드만 종료를 보장하도록 한개만 넣고 나머지는 주석처리했습니다. m1.start(); m1.join()만이 thread1의 전부 실행을 보장하고 나머지는 그렇지 않더군요. m2.join(); 과 m3.join();은 각 쓰레드가 여전히 온전히 종료가 안되고 번갈아 가면서 실행이 되더군요. 그것을 왜그런것인지요?

    답글삭제