본문 바로가기
Java/기초

[java] 스레드(Thread)[1] - run()과 start()의 차이

by EricJeong 2019. 7. 27.

Thread란?

독립적으로 수행 가능한 메인 프로세스 또는 메인 프로세스 외의 기타 프로세스의 기저 입니다.

하나의 프로세스 내에서 실행하는 병행 메서드의 단위로, 어플리케이션의 스레드가 모두 종료되면 해당 어플리케이션이 종료됩니다.

java 프로그램을 시작할 때 사용하는 main 메서드 또한 스레드입니다.

 

 

 

Thread 생성 방법

Thread는 white-box방식black-box 방식으로 생성할 수 있습니다.

 

white-box 방식 - java.lang.Thread 클래스를 상속받아서 생성하는 방식입니다.

 

 

white-box thread example(run())

 

package example;

public class ThreadTest extends Thread{
	String name;
	
	public ThreadTest(String name){
		this.name = name;
	}
	
	@Override
	public void run() {
		for(int i=0; i<3; i++) {
			System.out.println("안녕하세요 전 스레드 - " + name + " 입니다.");
			try {
				// sleep 메서드는 쓰레드를 ms 단위로 대기시키는 메서드 입니다.
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
	public static void main(String[] args) {
		// 스레드를 다섯개 생성합니다.
		ThreadTest thread1 = new ThreadTest("thread1");
		ThreadTest thread2 = new ThreadTest("thread2");
		ThreadTest thread3 = new ThreadTest("thread3");
		ThreadTest thread4 = new ThreadTest("thread4");
		ThreadTest thread5 = new ThreadTest("thread5");
		
		// 스레드를 실행합니다.
		// 스레드를 실행할 때에는 오버라이드한 run()이 아닌
		// start() 메서드를 실행시켜 주어야 합니다.
		thread1.run();
		thread2.run();
		thread3.run();
		thread4.run();
		thread5.run();
	}
}

Thread를 상속받은 후 run() 메서드를 오버라이드 하여 구현해 주어야 원하는 처리를 하실 수 있습니다. 스레드의 run() 메서드는 우리가 사용하는 main() 메서드와 같은 역할을 한다고 볼 수 있습니다. 스레드를 시작하면 run() 메서드 부터 시작하여 실행하기 때문입니다.

 

스레드를 시작할 때에는 구현한 run() 메서드를 시작하는게 아닌, start()메서드를 시작해야 정상적으로 실행시킬 수 있습니다.

 

 

만약 스레드를 실행시킬 때 run()으로 시작시킨다면 어떻게 될까요?

 

스레드를 run() 메서드를 통해 실행시킨다면, 스레드는 main 메소드 위쪽에 스택으로 쌓이게 되며, 병행 처리를 하지 못하게 됩니다.

 

run() 메서드를 실행 시킨 결과입니다.

각각의 메서드가 종료되어야 다른 스레드가 실행되는 것을 확인할 수 있습니다.

 

그렇다면 스레드의 start()메서드를 실행시킨다면 어떻게 될까요?

 

 

white-box thread example(start())

package example;

public class ThreadTest extends Thread{
	String name;
	
	public ThreadTest(String name){
		this.name = name;
	}
	
	@Override
	public void run() {
		for(int i=0; i<3; i++) {
			System.out.println("안녕하세요 전 스레드 - " + name + " 입니다.");
			try {
				// sleep 메서드는 쓰레드를 ms 단위로 대기시키는 메서드 입니다.
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
	public static void main(String[] args) {
		// 스레드를 다섯개 생성합니다.
		ThreadTest thread1 = new ThreadTest("thread1");
		ThreadTest thread2 = new ThreadTest("thread2");
		ThreadTest thread3 = new ThreadTest("thread3");
		ThreadTest thread4 = new ThreadTest("thread4");
		ThreadTest thread5 = new ThreadTest("thread5");
		
		// 스레드를 실행합니다.
		// 스레드를 실행할 때에는 오버라이드한 run()이 아닌
		// start() 메서드를 실행시켜 주어야 합니다.
		thread1.start();
		thread2.start();
		thread3.start();
		thread4.start();
		thread5.start();
	}
}

 

 

 

실행결과(start)

 

 

스레드가 순차적으로 실행되는게 아닌 병행실행이 되기 때문에, 스레드의 실행이 일관적으로 나타나지 않는 것을 확인할 수 있습니다.

 

스레드로 병행처리를 하고싶다면 스레드의 start()메서드를 사용해야 정상적으로 스레드 병행 처리를 기대할 수 있을 것입니다.

댓글