학습할 것 (필수)

  • Thread 클래스와 Runnable 인터페이스
  • 쓰레드의 상태
  • 쓰레드의 우선순위
  • Main 쓰레드
  • 동기화
  • 데드락

Thread 클래스와 Runnable 인터페이스

프로세스와 쓰레드

프로세스

  • 프로그램을 실행하면 OS로 부터 실행에 필요한 메모리를 할당받아 프로세스가 된다.
  • 이 프로그램을 실행하는데 필요한 데이터와 메모리등의 자원 그리고 쓰레드로 구성되어 있다.
  • 모든 프로세스에는 한개이상의 쓰레드가 존재한다.
  • 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 칭함.

쓰레드

  • 프로세스 내에서 작업을 수행하는 역할

쓰레드를 구현하는 방법 중 두가지

Thread 클래스를 상속

class TestThread1 extends Thread { public void run() { //내용 } } thread 클래스를 상속받아 run을 오버라이딩하여 구현함.

Runnable 인터페이스를 구현

class TestThread2 implements Runnable { public void run() { //내용 } } Runnable 인터페이스의 run을 구현함.

두가지 방식의 차이점

  1. 인스턴스의 생성법이 다르다.

    TestThread1 thread = new TestThread1(); // Thread 클래스를 상속받았을 경우 Runnable r = new TestThread2(); Thread t = new Thread(r); // Runnable 인터페이스를 구현한 경우
  2. 호출이 다르다.

    • Thread클래스를 상속받으면 서브클래스에서 슈퍼클래스의 메소드를 직접 호출가능
    • Runnable을 구현할 경우 static 메소드인 currentThread()를 호출하여 쓰레드의 참조를 가져와야 호출이 가능함.

쓰레드의 상태

  1. NEW
    • 아직 thread가 생성은 됬지만 실행되지 않은 상태.
  2. RUNNABLE
    • jvm이 thread를 실행중인 상태
    • 실행중이므로 CPU에서 자원을 할당받은 상태이고
    • 운영체제의 자원 분배로 인해 WAITING 상태가 될수 있다.
  3. BLOCKED
    • Monitor를 획득하기 위해 다른 스레드가 락을 해제하기를 기다리는 상태
    • Java thread 동기화 모델은 모니터란 개념을 적용 중이다.
    • 모니터는 하나의 데이터 ( 객체 ) 마다 하나의 모니터를 결합 할수 있으며
    • 그것이 결합된 데이터 가 동시에 두개 이상의 스레드에 의해 접근할수 없도록 막는 락을 제공함
    • 결국 BLOCKED 상태는 다른사용자가 사용하고 있는 데이터를 사용하기위해 기다리고 있는 상태
  4. WAITING
    • 다른 스레드가 특정 작업을 수행할떄까지 무기한으로 대기중인 상태
    • wait() , join() , park() 메소드 등을 이용해 대기중임.
  5. TIMED_WATING
    • 다른 스레드가 지정된 대기 시간까지 작업을 수행하기를 기다리는 상태
    • sleep() , wait(), join(), park() 메소드등을 사용해 대기중인 상태
    • WAITING 상태와의 차이점은 메서드의 인수로 최대 대기 시간을 명시할 수 있어 외부적인 변화뿐만 아니라 시간에 의해서도 WAITING 상태가 해제될 수 있다는 것
    • 출처 d2.naver
  6. TERMINATED
    • 스레드가 종료된 상태

쓰레드의 우선순위

  • 쓰레드는 우선순위라는 속성 ( 멤버변수) 를 가지고 있는데 이 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
  • 쓰레드가 수행하는 작업의 중요도에 따라 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖게 할수 있다.
  • setPriority 메소드로 우선순위를 지정할수 있음.
  • getPriority로 우선순위를 반환함.

메인 쓰레드

  • main 메소드에서 작업을 수행하는 것
  • main 메소드를 실행시 jvm에서 돌아가게 되며 이때 jvm은 프로세스가 되어 운영체제로 부터 자원을 할당받고 쓰레드가 실행되는데 이떄 main 메소드에서 실행하는게 main 쓰레드다.

데몬 쓰레드

  • 다른 일반 쓰레드의 작업을 돕는 보조적인 역할의 쓰레드
  • 일반 쓰레드가 모두 죵로되면 같이 종료된다.
  • setDaemon 메소드로 유저 쓰레드가 될지 데몬 쓰레드가 될지 정할수 있다.

동기화

  • 멀티쓰레드를 사용하는 경우 하나의 데이터를 사용하려고 할때 다른 쓰레드가 접근하지 못하게 막는 것.

public synchronized void test() { } // 메소드 전체를 임계 영역으로 지정 public void test() { synchronized() { } } // 특정 지역을 임계 영역으로 지정

주의점

  • 임계영역은 작을수록 좋음.
    • 임계영역이 클수록 어떤 오류가 발생할지 모르기 때문.
  • 임계영역은 최소한으로 줄여야함
    • 임계영역이 여러곳일 경우 A 쓰레드에서는 통과가 안될 로직이 B 쓰레드가 작동함으로써 통과되는 버그가 일어날수도 있기 떄문.

데드락

  • 두개 이상의 스레드에서 작업을 완료하기 위해 상대의 작업이 끝나기를 기다리는 상황

  • 쓰레드 A가 작업을 계속 하려면 쓰레드 B의 작업이 끝나기를 기다려야 하고

  • 쓰레드 B가 작업을 계속 하라면 쓰레드 A의 작업이 끝나기를 기다려야 하는 상황.

  • 어느 한쪽이 자신의 락을 해제하기 전까지는 데드락 상태는 해제되지 않는다.

참조

'백선생님 온라인스터디' 카테고리의 다른 글

13주차 I/O  (0) 2021.03.01
12주차 애노테이션  (0) 2021.02.28
11주차 Enum  (0) 2021.01.30
9주차 - 예외 처리  (0) 2021.01.19
8주차 - 인터페이스  (0) 2021.01.16

+ Recent posts