상세 컨텐츠

본문 제목

java에서 Thread를 생성하는 방법

Java

by Wanderer Kim 2025. 5. 26. 23:57

본문

728x90

java에서 thread를 생성하는 방법들을 알아보자

Thread 상속

public class HelloThread extends Thread {
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + ": run()");
	}
}

public class HelloThreadMain {
	public static void main(String[] args) {
		System.out.println(Thread.currentThread().getName() + ": main()
		start");
		HelloThread helloThread = new HelloThread();
		System.out.println(Thread.currentThread().getName() + ": start() 호출
		전");
		helloThread.start();
		System.out.println(Thread.currentThread().getName() + ": start() 호출
		후");
		System.out.println(Thread.currentThread().getName() + ": main() end");
	}
}
main: main() start
main: start() 호출 전
main: start() 호출 후
Thread-0: run()
main: main() end
```
  • Thread 클래스를 상속하고, thread가 실행할 코드를 run() 메서드에 재정의한다.
  • Thread.currentThread(): 해당 코드를 실행하는 스레드 객체를 조회할 수 있다.
  • Thread.currentThread().getName(): 실행 중인 스레드의 이름을 조회한다.
  • Thread를 상속받는 HelloThread를 생성 후 start()를 호출하면 스레드가 실행된다.
  • 만약 start() 메서드가 아니라 run() 메서드를 직접 호출하게 되면 새로운 스레드가 생성되지 않고 main스레드가 HelloThread를 직접호출하게 된다.
  • 예제 코드 실행 결과를 보면 main 실행 흐름과 상관없이 thread가 시작되고 끝나는 것을 볼 수 있다.

시간 흐름으로 분석

  • main 스레드가 HelloThread 인스턴스를 생성한다. 이때 스레드 이름을 지정하지 않으면 THread-0, Thread-1과 같은 임의의 이름을 부여한다.
  • start() 메서드를 호출하면, Thread-0 스레드가 시작되면서 Thread-0 스레드가 run() 메서드를 호출한다.
    • 중요한 점은 main 스ㅔㄹ드가 run() 메서드를 실행하는게 아니라 Thread-0 스레드가 run() 메서드를 실행한다는 점이다.
    • main 스레드는 단지 start() 메서드를 통해 Thread-0 스레드에게 실행을 지시할 뿐이다.
  • 이제 main 스레드와 THread-0 스레드는 동시에 실행된다.

스레드 간 실행 순서는 보장하지 않는다.

스레드는 동시에 실행되기 때문에 스레드 간에 실행 순서는 얼마든지 달라질 수 있다. 따라서 다음과 같이 다양한 실행 결과가 나올 수 있다.

main 스레드가 빨리 실행된 경우

main: main() start
main: start() 호출 전
main: start() 호출 후
main: main() end
Thread-0: run()

Thread-0 스레드가 빨리 실행된 경우

main: main() start
main: start() 호출 전
Thread-0: run()
main: start() 호출 후
main: main() end
```

main 스레드가 실행 중간에 Thread-0스레드가 실행된 경우

main: main() thread.start
main: start() 호출 전
main: start() 호출 후
Thread-0: run()
main: main() end
반응형

'Java' 카테고리의 다른 글

Duration, Period  (2) 2025.06.02
Instant  (1) 2025.05.23
OffsetDateTime  (0) 2025.05.23
ZonedDateTime  (1) 2025.05.22
Context Switching이란?  (0) 2025.05.16

관련글 더보기

댓글 영역