-
1.개요
자바 스레드에 대해 공부한 부분을 정리해보았습니다.
2.자바 메모리 구조

1)메서드 영역 : 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.
- 클래스 정보 : 클래스의 실행코드,클래스 필드, 메서드 등 모든 실행 코드가 존재한다.
- static 영역 : static 변수들을 보관한다.
- 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다. (ex)private static final String HUMAN = "GG";
2)스택 영역 : 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보등을 포함한다.
- 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고 , 메서드가 종료되면 해당 스택 프레임이 제거된다.
- 스택영역은 스레드1개당 1개씩 존재한다. 만약 멀티스레드를 사용하여 스레드가 4개라면 스택도 4개이다.
3)힙 영역 : 객체(인스턴스)와 배열이 생성되는 영역이다. gc가 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 gc에 의해 제거된다.
3.스레드 활용
1)스레드 생성
package thread; public class HelloThread extends Thread{ @Override public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName() + ": hello() run"); } }2)스레드 실행
package thread; public class ThreadMain { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName() + ": main() start"); HelloThread hello = new HelloThread(); System.out.println(Thread.currentThread().getName() + ": hello start() 호출 전"); hello.start(); System.out.println(Thread.currentThread().getName() + ": hello start() 호출 후"); System.out.println(Thread.currentThread().getName() + ": main() end"); } }3)실행 결과
main: main() start main: hello start() 호출 전 main: hello start() 호출 후 main: main() end Thread-0: hello() run4)메인 메서드 동작 과정
- HelloThread 생성 전 main 스레드가 main메서드를 실행한다.

- HelloThread 생성 후 start() 메서드를 호출하면 자바는 스레드를 위한 별도의 스택 공간을 할당한다.
- 스레드 객체를 생성하고 반드시 start() 를 호출해야 스택 공간을 할당 받고 스레드가 작동한다.
- 스레드에 이름을 주지 않으면 Thread-0,Thread-1 과 같은 임의의 이름을 부여한다.
- start() 메서드를 통해 HelloThread 의 run 메서드가 스택 프레임으로 생성되어 스택에 올라갔다.

5)시간흐름으로 분석

- hello.start() 메서드가 호출되고 나서 HelloThread 클래스의 run 메서드가 종료될 때 까지 main 메서드는 기다리지 않는다.
- hello.start() 메서드를 실행만 할 뿐 아래 로직을 바로 실행시킨다.
- 스레드는 순서와 실행 기간을 모두 보장하지 않는다. 이것이 멀티스레드이다.
6)메서드.start() vs 메서드.run()
package thread; public class ThreadMain { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName() + ": main() start"); HelloThread hello = new HelloThread(); System.out.println(Thread.currentThread().getName() + ": hello start() 호출 전"); hello.run(); System.out.println(Thread.currentThread().getName() + ": hello start() 호출 후"); System.out.println(Thread.currentThread().getName() + ": main() end"); } }- 만약 메서드.run() 을 사용했다면 main 메서드가 HelloThread 의 run 메서드를 실행하기 때문에 단일스레드로 작동된다.
실행 결과
main: main() start main: hello start() 호출 전 main: hello() run main: hello start() 호출 후 main: main() end'java' 카테고리의 다른 글
자바 - 와일드카드 (0) 2025.12.14 자바 - 제네릭 (0) 2025.12.14 자바 컴파일,런타임과정 (0) 2024.12.21 멤버 상수 final , static 알고가기 (0) 2019.12.05 자바 - 클래스,인스턴스,객체 (0) 2019.12.05