쓰레드를 구현하는 방법은 Thread 클래스를 상속받는 방법과 Runnable 인터페이스를 구현하능 방법, 두 가지가 있다. Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에, Runnable 인터페이스를 구현하는 방법이 일반적이다.

쓰레드를 구현한다는 것은, 쓰레드를 통해 작업하고자 하는 내용을 run() 에 작성하는 것이다.

class ThreadEx1 {
		public static void main(String args[]) {
				ThreadEx1_1 t1 = new ThreadEx1_1();

				Runnable r = new ThreadEx1_2();
				Thread t2 = new Thread(r);

				t1.start();
				t2.start();
		}
}

class ThreadEx1_1 extends Thread {
		public void run() {
				for (int i = 0; i < 5; i++) {
						System.out.println(getName());
				}
		}
}

class ThreadEx1_2 implements Runnable {
		public void run() {
				System.out.println(Thread.currentThread().getName());
		}
}

Thead 객체 내부에서 Runnable 을 가지고 있으며 Thread 를 실행할 때 Runnable 의 run() 을 실행한다.

쓰레드의 실행 - start()

쓰레드를 생성했다고 해서 자동으로 실행되는 것이 아닌 start() 를 호출해야 한다. start() 를 호출한다고 바로 실행하는 것은 아니고, 실행대기 상태에 있다가 본인의 차례가 되면 실행한다. 쓰레드의 실행순서는 OS 의 스케쥴러가 작성한 스케쥴에 의해 결정된다.

또, 한 번 실행이 종료된 쓰레드는 다시 실행할 수 없다. 즉, 하나의 쓰레드에 대해 start() 가 한 번만 호출될 수 있다. 쓰레드의 작업을 한 번 더 실행하고 싶다면 새로운 Thread 객체를 할당해야 한다.