목차

  1. 메모리의 구조
  2. 프로세스(process)와 스레드(Thread) 란?
    1. 프로세스
    2. 스레드
  3. 멀티 스레드의 장단점
    1. 장점
    2. 단점
  4. 스레드의 구현과 실행
    1. 상속과 인터페이스를 통한 구현
    2. start() 와 run() 메소드
    3. 생성자와 메소드

 

 

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) 장점

  1. 시스템 자원(메모리, CPU)을 효율적으로 사용할 수 있다
  2. 사용자에 대한 응답성이 향상된다
  3. 작업이 분리되어 코드가 간결해진다

 

 

2) 단점

  1. 동기화에 주의해야 한다
  2. 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다
  3. 각 스레드가 효율적으로 고르게 실행될 수 있게 해야 한다

 

 

 

4. 스레드의 구현과 실행

1) 상속과 인터페이스를 통한 구현

  • 클래스의 상속 : 자바는 단일 상속이기 때문에 효율이 저조
  • 인터페이스 구현 : 다중 상속이 가능하기 때문에 효율적

 

상속과 인터페이스는 스레드 이름(getName()) 반환 방법이 다르다
실행순서는 OS스케줄러가 결정하기에 실행할 때 마다 달라질 수 있음

 

 

 

 

2) start() 와 run() 메소드

  • 코드를 실행하는 run() 메소드가 있는데 왜 별도로 start() 메소드를 사용하는 이유?
    • start()는 스레드가 시작되도록 JVM에 요청을 하는 메소드로 start() 없이 run()만 사용한다면 멀티 스레드 환경이 되지 않는다
  • 멀티 스레드 동작 과정
    1. main메소드가 start() 를 실행
    2. start()가 새로운 스택 생성
    3. 새로운 스택에 run()를 넣고 start()는 종료
    4. 각 스레드가 별도의 호출 스택을 실행 >> 여러 작업을 동시에 가능

멀티 스레드 동작 과정

 

 

 

3) 스레드의 메소드

  1. 생성자
    1. Thread( ) : 새로운 스레드 객체 할당
    2. Thread(String name) : 새로운 스레드 객체가 할당되며, 스레드 이름은 name으로 설정
    3. Thread(Runnable target) : Runnable target이 구현된 스레드 객체 할당
    4. Thread(Runnable target, String name) : Runnable target이 구현된 스레드 객체가 할당되면 스레드 이름은 name으로 설정
  2. 메소드
    1. void start( ) : 스레드가 시작되도록 요청하는 메소드로 JVM은 해당 스레드의 run() 메소드를 호출
    2. void run( ) : 스레드의 실행코드가 작성되는 메소드로 사용자는 run() 메소드를 오버라이드 하여 사용
    3. static void sleep(long millis) : millis(천분의 일초 단위) 시간동안 현재 스레드를 일시중지. (InterruptedException 예외처리 필수)
    4. void join( ) : 이 스레드가 끝날때까지 기다림
    5. void join(long millis) : 최대 millis 시간동안 이 스레드가 끝날때까지 기다림
    6. void interrupt( ) : sleep()이나 join()에 의해 일시정지 상태인 스레드를 실행대기상태로 변경
    7. void stop() : 스레드 즉시 종료
    8. void suspend() : 스레드 일시정지 (resume()을 호출하면 다시 실행대기상태로 변경)
    9. void resume() : suspend()에 의해 일시정지상태에 있는 스레드를 실행대기상태로 변경
    10. static void yield( ) : 현재 스레드의 실행시간을 다른 스레드에게 양보
    11. static Thread currentThread( ) : 현재 실행중인 스레드 객체의 참조값을 반환
    12. long getId( ) : 스레드의 Id를 반환
    13. String getName( ) : 스레드의 이름을 반환
    14. int getPriority( ) : 스레드의 우선순위 값을 반환 (우선순위 범위 : 1 ~ 10)
    15. Thread.State getState( ) : 스레드의 state 값을 반환
    16. ThreadGroup getThreadGroup( ) : 스레드가 속한 스레드 그룹을 반환
    17. static boolean interrupted( ) : main 스레드의 interrupted 여부를 반환 후 false로 초기화
    18. boolean isInterrupted( ) : 이 스레드의 interrupted 여부를 반환
    19. boolean isAlive( ) : 이 스레드가 살아있는지 여부를 반환
    20. boolean isDaemon( ) : 이 스레드가 데몬 스레드인지 여부를 반환
    21. void setDaemon(boolean on) : 이 스레드를 데몬 스레드로 변경 (매개변수 on을 true로 지정하면 데몬 스레드가 된다)
    22. void setName(String name) : 이 스레드의 이름을 name으로 변경 
    23. void setPriority(int newPriority) : 이 스레드의 우선순위를 newPriority로 변경
    24. String toString( ) : 이 스레드의 이름, 우선순위, 스레드그룹등의 정보를 담은 문자열을 반환

 

+ Recent posts