본문 바로가기
Language/Java

자바 Thread에서 run()과 start()의 차이점은?

by wakestand 2020. 2. 2.
반응형

먼저 A와 B만 무한 출력하는 클래스

TestOfThread, TestOfThread2를 만든 뒤에

ThreadCaller 클래스에서 TestOfThread, TestOfThread2를 객체화 한 후 

run(), start() 시키는 코드인데

start() 테스트 시에는 run()을 start()로 바꿔주면 된다

 

스크린샷을 보면 왼쪽이 스레드 시작 시 run()을 사용했을 때

우측이 스레드 시작 시 start()를 사용했을 때 콘솔 창인데

보면 왼쪽은 a.run()이 무한 반복하므로

TestOfThread의 run() 메소드가 끝나지 않아 아래줄의 코드가 실행되지 않는 것이 보인다

 

반면 start() 메소드는 코드의 끝남 여부와 관계없이 스레드를 돌리면서

아래줄의 코드를 계속 수행하기 때문에 코드들이 뒤얽혀 있는 것이 보인다

 

여기서 포인트는

start()는 코드의 완료 여부와 상관없이 계속 아래 코드를 수행하기 때문에

멀티 스레드를 사용하는 경우에는 run()이 아닌 start를 사용해 줘야 한다는 것!

 

테스트에 사용한 코드는 아래를 참고해주면 된다

여기서 그냥 복붙 시 콘솔 라인 생기는 속도가 너무 빨라 확인을 하지 못할 수 있으므로

아래 글을 참고해 콘솔 최대 라인 수를 변경한 뒤에 테스트 해볼것을 권장한다

 

이클립스 콘솔 라인 수 제한 변경방법

먼저 이클립스 상단 > Preferences 를 누른 후에 왼쪽 탭에서 Run/Debug를 눌러주면 Limit console output이 체크된 것이 보이는데 이걸 해제해 주면 이클립스 콘솔 라인수가 무제한으로 늘어난다 혹은 체크한..

wakestand.tistory.com

// 쓰레드1
public class TestOfThread extends Thread {
	
	public TestOfThread() {
		// Nothing
	}
	
	public void run() {
		while(true) {
			System.out.println("A"); // A 무한반복
		}
	}

}

 

// 쓰레드2
public class TestOfThread2 extends Thread {
	
	public void TestOfThread2() {
		// Nothing
	}
	
	public void run() {
		while(true) {
			System.out.println("B"); // B 무한반복
		}		
	}

}

 

public class ThreadCaller {

	public static void main(String[] args) {
		TestOfThread a = new TestOfThread(); 
		TestOfThread2 b = new TestOfThread2(); // 객체화
		
		// start 시에는 쓰레드 돌리면서 아래 코드 수행
		// run 시에는 run 완료 후 아래 코드 수행
		a.start();
		System.out.println("A PASS!");
		b.start();
		System.out.println("B PASS!");
		
	}

}
반응형

댓글