2008년 10월 26일
멀티 쓰레드.
이번 시간에는 멀티쓰레드에 대해서 알아봅시다.
먼저 멀티 쓰레드를 알기 이전에 쓰레드에 관한 것 부터 알고 넘어가겠습니다.
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)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]