멀티 쓰레드.

이번 시간에는 멀티쓰레드에 대해서 알아봅시다.

먼저 멀티 쓰레드를 알기 이전에 쓰레드에 관한 것 부터 알고 넘어가겠습니다.

Thread 클래스에 대해서 알아봅시다.

자바를 하면서 쓰레드를 한번쯤은 써봤을거라 예상 됩니다.

Thread.sleep(1000); 이런식으로 말이지요.

API를 보게 되면 클래스에 대한 자세한 정보를 확인 하실 수 있는데

Thread.sleep(1000); 는 Thread 클래스의 static void sleep(long milis); 메소드를 이용한 것입니다.

1초간 프로그램 동작을 쉬는 것이지요. 이것은 쓰레드를 이용하는 것 입니다.

정말 쉽고도 간단한 설명일거라 생각됩니다.

그럼 멀티쓰레드란 무엇일까요? 위와 같은 쓰레드를 2개 이상 동작 되는것일까요?

쉽게 이야기 하자면 멀티쓰레드란 동시에 무엇인가를 처리하는 것을 멀티쓰레드라 보시면 됩니다.

예를 들면 게임에서 이러한 것을 볼 수 있습니다.
2대의 자동차 경주 게임의 경우 두 자동차가 모두 동시에 움직여야 하는데 멀티쓰레드가 아니라면
차 한대가 움직이고 나서 다른 한대가 움직여야 하는 문제가 발생하죠..

이런 건 레이싱이 아니라 타임어택에 해당하겠죠 -_-..

그래서 멀티 쓰레드라는 것을 이용하는 것 입니다.

그럼 다시 API에서 Thread 클래스의 메소드들을 보도록 합시다.

메소드 중에서 run()과 start() 이 두 메소드에 관심을 갖도록 합시다.

이 두메소드는 연결관계를 갖고 있는데 재미있게도
start()메소드를 사용하게 되면 run() 메소드가 실행 된다는 점입니다.

이렇게만 설명을 한다면 참으로 어떻게 멀티쓰레드가 되는지에 대해서 의문이 생길 수 있습니다.

만약 
            test1.start();
            test2.start();
            test3.start();
            test4.start();
            test5.start();
            test6.start();
            test7.start();
이렇게 한다면 test1이 시작되고 test2, 3, 4.... test7이 실행될거라 생각이 될거라 봅니다.
그러나 test1 부터 test7까지 동시에 작동하게 됩니다.

실제로 이를 활용해서 만든 아주 간단한 예제를 보여드리도록 하겠습니다.

위 화면은 비록 막대기 그림이지만 경마게임입니다 -_-;;
아주 기초적인 멀티쓰레드를 활용한 것이지요.

Thread 클래스를 상속 받아서 구현을 한 것이지요. 그리고 팁을 한가지 더 드리자면 Runnable 인터페이스를 구현해서 멀티 쓰레드를 이용할 수 있습니다. 자세한건 역시 API를 확인하세요.

이번 예제는 소스를 공개 하도록 하겠습니다. 감사합니다 ~

import java.awt.*;
import java.awt.event.*;
import java.util.*;

// 쓰레드 클래스를 상속 받아서  run을 오버라이딩 할 것이다.
public class ThreadTest extends Thread{
 static Canvas canvas;
 int y = 0;
 String str = null;
 Random rand = new Random();
 
 public ThreadTest(int y, String str){
  this.y = y;  
  this.str = str;
 }
 
 // run은 start를 통해서 실행 된다. 현재 run은 오버라이딩 한 상태다.
 public void run(){
  Graphics g = canvas.getGraphics();
  g.drawString(str, 20, y);
  for(int i=0;i<300;i++){
   try{
    Thread.sleep(100);
    i += rand.nextInt(5);
    //각 말들은 1초 간격으로 0부터 5 까지의 랜덤한 숫자로 달리게 된다.
    
    if(i > 300){
     i = 300;
    }
    g.fillRect(50, y, i, 20);
   }catch(Exception e){
    
   }
  }
 }
 
 public static void main(String args[]){
  Frame frm = new Frame("쓰레드 테스트");
  canvas = new Canvas();
  
  frm.setSize(400, 400);
  frm.add(canvas);
  frm.setVisible(true);
  
  ThreadTest test1 = new ThreadTest(30,"1번 말");
  ThreadTest test2 = new ThreadTest(70,"2번 말");
  ThreadTest test3 = new ThreadTest(110,"3번 말");
  ThreadTest test4 = new ThreadTest(150,"4번 말");
  ThreadTest test5 = new ThreadTest(190,"5번 말");
  ThreadTest test6 = new ThreadTest(230,"6번 말");
  ThreadTest test7 = new ThreadTest(270,"7번 말");
  test1.start();
  test2.start();
  test3.start();
  test4.start();
  test5.start();
  test6.start();
  test7.start();
  
  frm.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
   
  });
  
 }
}

by 만성피로 | 2008/10/26 22:11 | 정리할 자료들 | 트랙백 | 덧글(1)

트랙백 주소 : http://maydaisy.egloos.com/tb/1013204
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 김교수 at 2008/11/07 16:01
잘 했습니다. 포스팅도 animatedGIF를 이용해 효과적으로 했네요.^^

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶