Last Modified : 2011.01.02

스레드

프로그램은 위에서 아래로 왼쪽에서 오른쪽으로 순차적으로 실행된다.
처리되는 과정을 줄 그어 이어보면 실타래와 같게 될 것이다.
그래서 프로그램의 실행 흐름을 스레드라 한다.
지금까지 우리는 실이 한 가닥인 단일 스래드 프로그램만을 보아 왔다.
이번 과정은 실타래가 2가닥이상(멀티 스레드)인 프로그램을 만드는 방법을 소개한다.

멀티스레드 프로그램을 만드는 방법

  1. Thread 클래스를 상속
  2. Runnable 인터페이스를 구현

자바에서 멀티 스레드 프로그램을 만드는 방법은 간단하다.
위에 제시한 것과 같이 2가지 방법이 있는데, 우선 멀티스레드 프로그램과 비교하기 위해서 지금까지 많이 봐았던 단일 스레드 프로그램 예제(SingleThread.java)부터 보겠다.

단일 스레드 예제

SingleThread.java

package net.java_school.thread.test;

public class SingleThread {
	
	public void doA() {
		char[] alphabet = {'A','B','C','D','E','F','G','H','I','J'};
		int length = alphabet.length;
		for ( int i=0; i < length; i++ ) {
			System.out.print(alphabet[i]);
		}
	}

	public void doB() {
		for (int i = 0; i < 10; i++) {
			System.out.print(i);
		}
	}
	
	public static void main(String[] args) {
		SingleThread st = new SingleThread();
		st.doA();
		st.doB();
	}

}

doA와 doB는 같은 스레드에서 실행된다.
따라서 호출된 순서인 doA가 끝난 후 doB가 실행된다.

1. Thread 클래스를 상속

예제는 단일 스레드 예제에서 doA() 와 doB() 가 각각 다른 스레드에서 실행되게 된다.
Thread 를 상속하는 방법을 택했는데 객체 생성 후 start() 메소드를 호출하면 다른 스레드가 생성되고 doB()는 새로 생긴 스레드에서 실행되게 된다.

MultiThread1.java

package net.java_school.thread.test;

public class MultiThread1 extends Thread {

	public void doA() {
		char[] alphabet = {'A','B','C','D','E','F','G','H','I','J'};
		int length = alphabet.length;
		for ( int i = 0; i < length; i++ ) {
			System.out.print(alphabet[i]);
			try {
				// 테스트가 되기 위해 0.01초 쉬어 다른 쓰레드가 제어권을 갖도록 한다.
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public void doB() {
		for (int i = 0; i < 10; i++) {
			System.out.print(i);
			try {
				// 테스트가 되기 위해 0.01초 쉬어 다른 쓰레드가 제어권을 갖도록 한다.
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public void run() {
		doA();
	}
	
	public static void main(String[] args) {
		MultiThread1 mt1 = new MultiThread1();
		mt1.start();
		mt1.doB();
	}
}

2. Runnable 인터페이스를 구현

Runnable 인터페이스를 구현하는 방법이다.
객체 생성하고 Thread 생성자(Runnable 인터페이스를 인자로 가지는)에 객체 레퍼런스를 대입하는 부분을 잘 살펴야 한다.(42라인)

MultiThread2.java

package net.java_school.thread.test;

public class MultiThread2 implements Runnable {

	public void doA() {
		char[] alphabet = {'A','B','C','D','E','F','G','H','I','J'};
		int length = alphabet.length;
		for ( int i = 0; i < length; i++ ) {
			System.out.print(alphabet[i]);
			
			try {
				// 테스트가 되기 위해 0.01초 쉬어 다른 쓰레드가 제어권을 갖도록 한다.
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
	public void doB() {
		for (int i = 0; i < 10; i++) {
			System.out.print(i);
			
			try {
				// 테스트가 되기 위해 0.01초 쉬어 다른 쓰레드가 제어권을 갖도록 한다.
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public void run() {
		doA();
	}
	
	public static void main(String[] args) {
		MultiThread2 mt2 = new MultiThread2();
		Thread t = new Thread(mt2);
		t.start();
		mt2.doB();
	}
}