Java/Basic

[Java/Basic] Thread run과 start의 차이

Jeong Jeon
반응형

간단한 쓰레드를 하나 예시로 남겨두려고 한다.

Thread에서 run(); start(); 메서드 둘다 같은 기능을 하는것 같은데 뭐가 다를까 궁금할 수 있다.

초보들만...ㅎㅎ;;

 

여기서 궁금증을 해결하기위한 짧은 코드를 준비해 보았다.

 

먼저 start(); 로 Thread를 돌렸을때의 결과를 보고 run();으로 돌렸을때의 결과를 볼예정이다.

public class ThreadRunStartTest implements Runnable{

	int[] timeList = new int[10];

	public ThreadRunStartTest() {
		for (int i = 0; i < timeList.length; i++) {
			timeList[i] = i;
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub

		for (int i = 0; i < timeList.length; i++) {
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				// TODO: handle exception
			}
			System.out.println("@@name : "+Thread.currentThread().getName());
			System.out.println("@@가즈아"+timeList[i]);
		}
	}
	public static void main(String[] args) {
		ThreadRunStartTest test = new ThreadRunStartTest();
		Thread t = new Thread(test,"t Thread");
		Thread t1 = new Thread(test,"t1 Thread");
		t.start();
		t1.start();
	}
}

결과 :

@@name : t1 Thread
@@name : t Thread
@@가즈아0
@@가즈아0
@@name : t Thread
@@name : t1 Thread
@@가즈아1
@@가즈아1
@@name : t1 Thread
@@name : t Thread
@@가즈아2
@@가즈아2
@@name : t Thread
@@가즈아3
@@name : t1 Thread
@@가즈아3
@@name : t Thread
@@가즈아4
@@name : t1 Thread
@@가즈아4
@@name : t Thread
@@name : t1 Thread
@@가즈아5
@@가즈아5
@@name : t Thread
@@name : t1 Thread
@@가즈아6
@@가즈아6
@@name : t Thread
@@가즈아7
@@name : t1 Thread
@@가즈아7
@@name : t1 Thread
@@가즈아8
@@name : t Thread
@@가즈아8
@@name : t1 Thread
@@가즈아9
@@name : t Thread
@@가즈아9

 

자 현재의 Thread는 병렬로 처리된것을 볼수 있다. 가즈아! => start()메서드 사용

 

그럼 run()메서드도 똑같을까?

다시 run()메서드로 실행시켜보자.

public class ThreadRunStartTest implements Runnable{

	int[] timeList = new int[10];

	public ThreadRunStartTest() {
		for (int i = 0; i < timeList.length; i++) {
			timeList[i] = i;
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub

		for (int i = 0; i < timeList.length; i++) {
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				// TODO: handle exception
			}
			System.out.println("@@name : "+Thread.currentThread().getName());
			System.out.println("@@가즈아"+timeList[i]);
		}
	}
	public static void main(String[] args) {
		ThreadRunStartTest test = new ThreadRunStartTest();
		Thread t = new Thread(test,"t Thread");
		Thread t1 = new Thread(test,"t1 Thread");
		t.run();
		t1.run();
	}
}

결과 : 

@@name : main
@@가즈아0
@@name : main
@@가즈아1
@@name : main
@@가즈아2
@@name : main
@@가즈아3
@@name : main
@@가즈아4
@@name : main
@@가즈아5
@@name : main
@@가즈아6
@@name : main
@@가즈아7
@@name : main
@@가즈아8
@@name : main
@@가즈아9
@@name : main
@@가즈아0
@@name : main
@@가즈아1
@@name : main
@@가즈아2
@@name : main
@@가즈아3
@@name : main
@@가즈아4
@@name : main
@@가즈아5
@@name : main
@@가즈아6
@@name : main
@@가즈아7
@@name : main
@@가즈아8
@@name : main
@@가즈아9

 

뭔가 이상하다고 생각할 수 있다.

run()메서드로 실행하게 되면 한개의 Thread가 실행되고 난뒤 다음 Thread가 실행되는것을 볼수 있다.

또한 main이라는 Thread name을 공통적으로 갖게되는데, 

이유는

run()메소드는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(공간)을 생성한 다음 run()을 호출해서 그 안(스택)에 run()이 저장된다.

즉, 쓰레드를 사용하기 위해 run()를 실행시키는 순간 쓰레드만의 독립적인 작업 공간인 호출스택이 만들어지고, 그 후에 호출 스택안에 각 실행하고자 하는 예를 들면 run()과 같은 메소드들이 저장된다.

호출 스택에 있는 내용들이 모두 수행하고 나면 쓰레드는 호출스택 공간과 함께 메모리 상에서 소멸된다.

 

결론 :

병렬처리를 하고싶다면. ? => start();

병렬처리를 안하고싶다면 ? => run();

 

각각의 차이를 알고 사용하자...!

반응형