ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스레드
    java 2024. 8. 24. 15:23

    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() run

     

    4)메인 메서드 동작 과정

    • 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
Designed by Tistory.