Java/Concurrency

Java > Concurrency > 2. Thread 생성, 실행

Krevis 2024. 8. 23. 06:17

Thread 생성

https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/MakingThreadTest.java

 

Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하는 방법이 있다

 

Thread 객체의 기능을 확장할 때를 제외하곤 Runnable 인터페이스를 사용하는 것이 여러모로 좋다

 

run() 메서드를 오버라이딩해야 한다

 

 

Thread 실행

https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/MakingThreadTest.java

https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadInfoTest.java

 

start() 메서드를 호출하면 해당 쓰레드가 실행된다

 

 

start() 메서드를 호출했는데 왜 run() 메서드가 실행될까?

자바 API 코드를 살펴보면 start 메서드의 시그너처는 다음과 같다

public synchronized void start()

 

synchronized 키워드는 다음에 따로 다루겠다

 

메서드 내부에서 start0 메서드를 호출한다

 

start0 메서드의 시그너처는 다음과 같다

private native void start0();

 

네이티브 메서드로서 내부적으로 run() 메서드를 호출한다

자세한 건 API 코드를 참고하자

 

 

run() 메서드를 직접 호출하는 것과 start() 메서드를 호출하는 것의 차이

run() 메서드를 직접 호출하는 것은 쓰레드를 실행하는 것이 아닌 단순히 클래스의 메서드를 실행하는 것이다. 메인 쓰레드의 Call stack을 사용하기 때문에 쓰레드들의 실행이 순차적이 된다

 

start() 메서드를 호출하면 JVM은 쓰레드들을 위한 호출 스택을 별도로 만들기 때문에 독립적으로 실행되게 된다