Java Adv 01 - Thread 1

자바의 메모리 구조

  • 메서드 영역 : 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터들을 관리한다. → 이 영역은 프로그램의 모든 영역에서 굥유한다
    • 클래스 정보 : 클래스의 실행 코드(바이트 코드), 필드, 메서드 생성자 코드든 모든 실행 코드가 존재한다.
    • static 영역 : static 변수들을 보관한다.
    • 런타임 상수 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.
  • 스택 영역 : 자바 실행 시, 하나의 실행 스택이 형성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.
    • 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 스택 프레임이 제거된다.
  • 힙 영역 : 객체(인스턴스) 와 배열이 생성되는 곳 가비지 컬렉션이 이루어지는 주요 영역이며 더 이상 참조되지 않는 객체는 GC에 의해서 제거된다.

참고 : 스택 영역은 더 정확히는 각 스레드별로 하나의 실행 스택이 생성되고 따라서 스레드 수 만큼 스택이 생성된다. 지금은 스레드를 1개만 사용하므로 스택도 하나이다. 이후 스레드를 추가할 것인데 그러면 스택도 스레드 수 만큼 증가한다.

스레드를 만들 때에는 Thread클래스를 상속받는 방법과 Runnable 인터페이스를 구현하는 방법이 있다.

package thread.start;

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" );

    }
}

  • start() 메서드는 스레드가 실행하는 아주 특별한 메서드이다.
    • start를 호출하면 HelloThread 스레드가 run() 메서드를 실행한다.
  • run 메서드가 아니라 반드시 start method를 실행해야 한다. 그래야 별도의 스레드에서 run코드가 실행이 된다.

스레드 생성 전

main() 메서드는 main()이라는 이름의 스레드가 실행하는 것을 확인할 수 있다.

프로세스가 작동하려면 스레드가 최소한 하나는 있어야 한다. 그래야 코드를 실행할 수 있다. 자바는 실행 시점에 main()이라는 이름의 스레드를 만들고 프로그램의 시작점인 main() 메서드를 실행한다.

스레드 생성 후

helloThread 객체를 생성한 후 start()메서드를 호출하면 자바는 스레드를 위한 별도의 스택 공간을 할당한다.

스레드 객체를 생성한 후 반드시 start()를 해줘야 스택 공간을 할당 받고 스레드가 동작한다.

스레드에 이름을 부여하지 않는다면 Thread-0, Thread-1과 같은 임시의 이름을 부여받는다.

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

image

호출 전하고 호출 후가 바로 나온 이유는 새로운 스레드에게 일을 지시만 한 다음에 코드를 빠져 나오기 때문이다. 스레드는 동시에 실행이 되기 때문에 스레드 간에 실행 순서는 얼마든지 달라질 수 있다. 따라서 스레드 간의 실행 순서는 얼마든지 달라질 수 있다. CPU 코어가 2개여서 물리적으로 정말 동시에 실행이 될수도 있고, 하나의 CPU에 시간을 나누어 실행될 수도 있다. 그리고 한 스레드가 얼마나 오랜기간 실행되는지도 보장하지 않는다. 한 스레드가 먼저 다 수행한 다음에 다른 스레드가 수행될 수도 있고, 둘이 완전히 번갈아 가면서 수행되는 경우도 있다. 스레드는 순서와 실행 기간을 모두 보장하지 않는다. 이것이 바로 멀티스레드이다.

Reference

인프런 김영한님의 자바강좌 + 나의 뇌



© 2022. by taewoo

Powered by taewoo