[출처] 김영한 자바-고급 1편 멀티스레드와 동시성
: 프로그램을 실행하는데 필요한 공통 데이터 관리, 프로그램의 모든 영역에서 공유
: 자바가 실행이 되면 하나의 스택이 생성 되는데, 각 프레임마다 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.
: 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 가비지 컬렉션에 의해 제거된다.
😃 스택 영역은 각 스레드별로 하나의 실행 스택이 생성되고 스레드 수가 추가되면 스택도 스레드 수 만큼 증가한다!
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();// 스레드를 호출
helloThread.run();//run 직접 실행
System.out.println(Thread.currentThread().getName() + " : start() 호출 후");
System.out.println(Thread.currentThread().getName() + " main() end");
}
}

main: main() start
main: run() 호출 전
main: run() 호출 후
main: main() end
Thread-0: run()
// main 스레드가 start 메서드 호출 후
// 별도의 스레드 Thread-0 스레드에서 run 메서드 실행 결과
main: main() start
main: run() 호출 전
main: run()
main: run() 호출 후
main: main() end
// main 메서드에서 run 메서드 실행 결과
참고로 스레드 간의 순서는 CPU가 결정하기 때문에 스레드는 순서와 실행 기간 모두 보장하지 않는다. (멀티스레드)
public class HellowRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() +" : run()");
}
}
public class HellowRunnabelMain {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() +" : main() start");
HellowRunnable runnable = new HellowRunnable();
Thread thread = new Thread(runnable);
thread.start();
System.out.println(Thread.currentThread().getName() +" : main() end");
}
}
Thread 상속 방식 보다는 Runnable 인터페이스 구현 방식 선호
-- 코드는 간단하지만, 자바는 단일 상속만 허용하기 때문에 이미 다른 클래스를 상속 받고 있는 경우 Thread 클래스를 상속 받을 수 없기 때문에 인터페이스 구현 방식보다 유연성이 떨어진다.
-- Runnable 인터페이스 방식은 스레드와 실행 작업을 명확히 분리할 수 있기 때문에 코드 가독성이 훨씬 뛰어나고 유연성이 좋아 유지보수가 편해지기 때문!