main 메서드의 코드를 수행하는 쓰레드. 쓰레드에는 '사용자 쓰레드'와 '데몬 쓰레드' 두 종류가 있다. 데몬 쓰레드는 보조 쓰레드이다.
프로그램은 사용자 쓰레드가 하나도 없을 때 종료된다.
public class ExThread {
static long startTime=0;
public static void main(String[] args) {
ThreadEx1 th1 = new ThreadEx1();
ThreadEx2 th2 = new ThreadEx2();
th1.start();
th2.start();
startTime = System.currentTimeMillis();
System.out.println("소요시간 : " + (System.currentTimeMillis()-startTime));
// 멀티 쓰레드 방식으로 실행
}
}
class ThreadEx1 extends Thread { // Thread 클래스를 상속 받아 구현하는 방식
public void run() {
for (int i=0; i<100; i++) {
System.out.println(new String("-"));
}
}
}
class ThreadEx2 extends Thread { // Thread 클래스를 상속 받아 구현하는 방식
public void run() {
for (int i=0; i<100; i++) {
System.out.println(new String("|"));
}
}
}
위와 같이 멀티 쓰레드 방식으로 실행하면 소요시간이 출력된 후에 두 개의 쓰레드가 출력된다. 메인 메소드가 먼저 실행하면서 print 구문을 실행하고 그 뒤에 쓰레드가 진행되기 때문이다.
public class ExThread {
static long startTime=0;
public static void main(String[] args) {
ThreadEx1 th1 = new ThreadEx1();
ThreadEx2 th2 = new ThreadEx2();
th1.start();
th2.start();
startTime = System.currentTimeMillis();
try {
th1.join(); // th1의 작업 종료까지 main쓰레드가 기다리게 된다.
th2.join(); // ht2의 작업 종료까지 main쓰레드가 기다리게 된다.
}catch(Exception e) {
}
System.out.println("소요시간 : " + (System.currentTimeMillis()-startTime));
// 멀티 쓰레드 방식으로 실행
}
}
코드를 위와 같이 변경한다고 하면 소요시간이 쓰레드가 종료될 때까지의 시간값이 나오게 된다. join메서드는 실행한 쓰레드 종료까지 메인 메서드가 대기하게 하는 기능을 한다.
쓰레드가 I/O과정 중 작업을 중단하고 기다리는 것을 의미한다. 가령 사용자에게 값을 입력해서 출력하는 쓰레드와, 단순히 수를 출력하는 쓰레드를 싱글 쓰레드 방식으로 진행한다고 생각해보자.
수를 출력하는 두 번째 쓰레드는 사용자가 값을 입력하는 첫 번째의 쓰레드가 종료될 때까지 작업을 중단하고 기다릴 수밖에 없다.
하지만 만약 멀티 쓰레드 방식으로 진행하면 사용자가 입력을 하기 위해 대기하는 동안에 다른 쓰레드는 작업을 진행할 수 있기 때문에 훨씬 효율적으로 일을 수행할 수 있다.