티스토리 뷰

JAVA로 Thread 관련 프로그래밍을 학습하다보면 start() 메서드와 run() 메서드를 보게되는데 두 메서드를 실행하게되면 Thread의 run() 메서드를 실행하게 된다. 다만 이 두 메서드의 동작방식을 제대로 이해하지 못하고 사용하면 프로그램이 원치않게 실행 될 수 있다. 이 두 메서드의 동작방식의 차이를 한번 살펴보자.

Thread.start()

main 메서드에 현재 실행된 Thread 이름을 출력하고 Thread 인스턴스를 5개 생성한다. 인스턴스 생성시 생성자로 Runnable 타입을 주입해준 후 start() 메서드를 실행하였다. 출력결과로 main Thread와 Thread 인스턴스 5개가 출력된 걸 확인할 수 있다.

Thread.run()


이번에는 run() 메서드를 실행해보았다. 하지만 위코드랑 비교해보면 결과가 다르게 출력되었다. 그 결과 멀티쓰레드가 아니라 싱글쓰레드로 동작된 걸 확인할 수 있다.

start()

start() 메서드를 실행하면 Thread의 상태를 체크한다. 상태가 0이 아니라면 IllegalThreadStateException 예외를 발생시킨다. 위 주석을 보면 A zero status value corresponds to state "NEW" 라고 적혀있는걸로 보아 NEW 상태가 0인 것 같다. 그리고 start() 메서드 내부엔 native 메서드인 start0() 메서드를 호출한다.



OpenJDK 공식문서에서 확인해보니 natvie 메서드 start0 메서드를 호출하면 JVM_StartThread라는 C++의 함수가 실행되는 것 같다.

 

여기를 가보면 JVM_StartThread 함수의 구현코드를 확인할 수 있는데 요약해보면 다음처럼 정리할 수 있다.

  • 입력받은 Thread 인스턴스가 null이 아니면(이미 실행했던 Thread 일 경우) 예외를 발생시킨다.
  • Call Stack 사이즈를 계산하여 Thread를 생성하고 start한다.

즉, start() 메서드를 실행하면 Thread를 새로 생성하여 start한다. start하게되면 run() 메서드가 호출된다.

run()

run() 메서드는 별거 없다. Runnable 타입의 멤버변수 target의 run() 메서드를 호출할 뿐이다. 말 그대로 Runnable 인터페이스의 run() 메서드 호출만하고 끝난다. Thread도 새로 생성하지 않기 때문에 싱글쓰레드에서 동작된다.

정리

start run
native 영역에서 새로운 Thread가 생성되며 Thread가 시작되면 run() 메서드가 실행된다. Thread가 생성되지 않으며 그냥 run() 메서드만 실행된다.
동일한 객체에서 두번이상 호출 시 IllegalThreadStateException 예외가 발생된다. 호출수에 제한없이 계속 호출할 수 있다.
멀티쓰레드로 동작한다. 싱글쓰레드로 동작한다.
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함