목차
- 메모리의 구조
- 프로세스(process)와 스레드(Thread) 란?
- 프로세스
- 스레드
- 멀티 스레드의 장단점
- 장점
- 단점
- 스레드의 구현과 실행
- 상속과 인터페이스를 통한 구현
- start() 와 run() 메소드
- 생성자와 메소드
1. 메모리의 구조
- Code, Data, Heap, Stack의 4가지로 구성
- Code : 개발자가 작성하는 소스코드 영역 (ex. 제어문, 함수, 상수 등)
- Data : main 함수에 선언되어 프로그램이 끝날 때 까지 남아있는 변수들을 저장하는 영역 (ex. 전역변수, static 변수 등)
- Heap : 사용자에 의해 동적으로 관리되는 영역 (ex. new생성자, 참조형 데이터 타입, 참조 변수, 배열 등)
- Stack : 프로그램이 자동으로 사용하는 임시 메모리 영역 (ex. 지역변수, 매개변수, 리턴 값 등)
2. 프로세스(process) 와 스레드(Thread) 란?
1) 프로세스
- 일반적으로 CPU에 의해 메모리에 올려져 실행 중인 프로그램
- 자바 JVM은 주로 하나의 프로세스로 실행되며, 동시에 여러 작업을 수행하기 위해서 멀티 스레드를 지원
2) 스레드
- 프로세스 안에서 작업을 실행하는 단위이며, 모든 프로세스는 최소한 하나의 스레드를 가지고 있다
- 프로세스 : 공장(작업환경)
- 스레드 : 일꾼
- main 메소드 하나로 실행되면 싱글 스레드이며, 스레드를 추가하게 되면 멀티 스레드 환경이 된다
- 멀티 스레드를 사용하면 여러 작업을 동시에 하기에 효율적으로 사용 가능
3. 멀티 스레드의 장단점
1) 장점
- 시스템 자원(메모리, CPU)을 효율적으로 사용할 수 있다
- 사용자에 대한 응답성이 향상된다
- 작업이 분리되어 코드가 간결해진다
2) 단점
- 동기화에 주의해야 한다
- 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다
- 각 스레드가 효율적으로 고르게 실행될 수 있게 해야 한다
4. 스레드의 구현과 실행
1) 상속과 인터페이스를 통한 구현
- 클래스의 상속 : 자바는 단일 상속이기 때문에 효율이 저조
- 인터페이스 구현 : 다중 상속이 가능하기 때문에 효율적
2) start() 와 run() 메소드
- 코드를 실행하는 run() 메소드가 있는데 왜 별도로 start() 메소드를 사용하는 이유?
- start()는 스레드가 시작되도록 JVM에 요청을 하는 메소드로 start() 없이 run()만 사용한다면 멀티 스레드 환경이 되지 않는다
- 멀티 스레드 동작 과정
- main메소드가 start() 를 실행
- start()가 새로운 스택 생성
- 새로운 스택에 run()를 넣고 start()는 종료
- 각 스레드가 별도의 호출 스택을 실행 >> 여러 작업을 동시에 가능
3) 스레드의 메소드
- 생성자
- Thread( ) : 새로운 스레드 객체 할당
- Thread(String name) : 새로운 스레드 객체가 할당되며, 스레드 이름은 name으로 설정
- Thread(Runnable target) : Runnable target이 구현된 스레드 객체 할당
- Thread(Runnable target, String name) : Runnable target이 구현된 스레드 객체가 할당되면 스레드 이름은 name으로 설정
- 메소드
- void start( ) : 스레드가 시작되도록 요청하는 메소드로 JVM은 해당 스레드의 run() 메소드를 호출
- void run( ) : 스레드의 실행코드가 작성되는 메소드로 사용자는 run() 메소드를 오버라이드 하여 사용
- static void sleep(long millis) : millis(천분의 일초 단위) 시간동안 현재 스레드를 일시중지. (InterruptedException 예외처리 필수)
- void join( ) : 이 스레드가 끝날때까지 기다림
- void join(long millis) : 최대 millis 시간동안 이 스레드가 끝날때까지 기다림
- void interrupt( ) : sleep()이나 join()에 의해 일시정지 상태인 스레드를 실행대기상태로 변경
- void stop() : 스레드 즉시 종료
- void suspend() : 스레드 일시정지 (resume()을 호출하면 다시 실행대기상태로 변경)
- void resume() : suspend()에 의해 일시정지상태에 있는 스레드를 실행대기상태로 변경
- static void yield( ) : 현재 스레드의 실행시간을 다른 스레드에게 양보
- static Thread currentThread( ) : 현재 실행중인 스레드 객체의 참조값을 반환
- long getId( ) : 스레드의 Id를 반환
- String getName( ) : 스레드의 이름을 반환
- int getPriority( ) : 스레드의 우선순위 값을 반환 (우선순위 범위 : 1 ~ 10)
- Thread.State getState( ) : 스레드의 state 값을 반환
- ThreadGroup getThreadGroup( ) : 스레드가 속한 스레드 그룹을 반환
- static boolean interrupted( ) : main 스레드의 interrupted 여부를 반환 후 false로 초기화
- boolean isInterrupted( ) : 이 스레드의 interrupted 여부를 반환
- boolean isAlive( ) : 이 스레드가 살아있는지 여부를 반환
- boolean isDaemon( ) : 이 스레드가 데몬 스레드인지 여부를 반환
- void setDaemon(boolean on) : 이 스레드를 데몬 스레드로 변경 (매개변수 on을 true로 지정하면 데몬 스레드가 된다)
- void setName(String name) : 이 스레드의 이름을 name으로 변경
- void setPriority(int newPriority) : 이 스레드의 우선순위를 newPriority로 변경
- String toString( ) : 이 스레드의 이름, 우선순위, 스레드그룹등의 정보를 담은 문자열을 반환
'IT 언어 > Java' 카테고리의 다른 글
[Java] 람다식 (Lamda) (0) | 2024.02.22 |
---|---|
[Java] Thread -2 (데몬 스레드, 사용자 스레드) (0) | 2024.02.20 |
[Java] enum (열거형 사용법) (0) | 2024.02.19 |
[Java] 제네릭 (Generics) (0) | 2024.02.15 |
[Java] Comparable 과 Comparator (객체 정렬) (0) | 2024.02.14 |