ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 24. 쓰레드
    카테고리 없음 2023. 6. 4. 18:36

    1. 프로세스와 쓰레드 (프로세스 : 쓰레드 = 공장 : 일꾼)

    - 프로세스: 실행 중인 프로그램, 자원과 쓰레드로 구성
    - 쓰레드: 프로세스 내에서 실제 작업을 수행, 모든 프로세스는 최소한 하나의 쓰레드가 포함
    * 실글 쓰레드 : 일꾼 1명
    ** 멀티 쓰레드: 일꾼 n명
    *** 작업관리자 세부정보에 스레드 참고


    2. 멀티쓰레드의 장단점 (대부분 멀티쓰레드)

    - 장점: 효울적인 자원 사용, 응답성 향상, 코드 간결
    - 단점: 동기화 주의, 교착상태 주의
    * 프로그래밍할 때 고려할 사항이 많음


    3.쓰레드의 구현과 실행 * run()을 구현

     1) 구현

      - Therad 클래스 상속
        MyThread t1 = new MyThread(); 스레드 생성
        t1.start(); 쓰레드의 실행
      - Runnable 인터페이스를 구현
        Runnable r = new MyThread2();
        Thread t2 = new Thread(r); // Thread(Runnable r)
        t2.start();


     2) 실행

     - 쓰레드를 생성 후 start()를 호출해야 작업 시작
         t2.start(); // t1 실행


    4. start()와 run()


    5. main쓰레드

    - main메서드의 코드를 수행하는 쓰레드
    - 사용자 쓰레드와 데몬 쓰레드 두 종류가 있다.
    * 실행 중인 사용자 쓰레드가 하나도 없으면 프로그램 종료


    6. 쓰레드의 I/O(입출력)블락킹(막기)

      * 입출력시 작업 중단
    - 사용자로부터 입력을 기다리는 구간에 아무일도 하지 않음
       멀티쓰레드로 작성하면 기다리는 구간에도 작업이 가능

     

    7. 쓰레드의 우선순위


    - 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업시간을 갖게 할 수 있다.

     

    8. 쓰레드 그룹

    - 서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것
    - 쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 자동으로 main쓰레드 그룹에 속함
    - 자신을 생성한 쓰레드(부모)의 그룹과 우선순위를 상속 받는다.

     

    9. 데몬 쓰레드(보조)

    - 일반 쓰레드의 작업을 돕는 보조적인 역할
    - 일반 쓰레드가 모두 종료되면 자동적으로 종료된다
    - 가비지 컬렉터, 자동저장, 화면 자동갱신 등이 사용된다.
    - 무한루프(while-try)와 조건문(if)을 이용해서 실행 후 대기 하다가 특정 조건이 만족되면 작업을 수행하고 다시 대기
     *setDemon(boolead on)은 반드시 start()를 호출하기 전에 실행

     

    10. 쓰레드 상태

      1) new: 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
      2) RUNNABLE: 실행 중 또는 실행 가능한 상태
      3) BLOCKED: 동기화블럭에 의해 일시정지 (대기)
      4) WAITING, TIMED_WAITING: 쓰레드의 작업이 종료는 아니고 실행은 가능하지 않은 상태(일시정지)
      5) TERMINATED: 쓰레드의 작업이 종료된 상태

     


    11. sleep()

    - 현재 쓰레드를 지정된 시간동안 멈추게 한다. (time up)
    - 예외처리를 해야 한다 (interrupted)
      * 시간 종료 또는 예외처리로 깨어난다
    - 특정 쓰레드를 지정해서 멈추게 하는 것은 불가능

     


    12. interrupt()

    - 대기상태인 쓰레드를 실행대기 상태로 만든다.
      * interrupt() false에서 true 상태로 변경
      ** isInterrupted() 쓰레드의 interrupted상태를 반환
      *** interrupted() 현재 interrupted 상태를 알리고 false로 초기화

     


    13. suspend(), resume(), stop() *사용권장X, dead-lock 교착 상태 가능성 잇음

    - 쓰레드의 실행을 일지정지, 재개, 완전정지 시킨다
      start()실행 - 줄서기 - 실행 - stop() - 소멸
      * 실행 중 suspend() 일시정지 <=> resume() 재개

     


    14. join()


    - 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다

     


    15. yield()

    - 남은 시간을 다음 쓰레드에게 양보하고 자신은 실행대기
    - yield()와 interrupt()를 적절히 상용하면, 응답성과 효율을 높일 수 있다.

     


    16. 쓰레드의 동기화

    - 멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있다
    - 진행중인 작업이 다른 쓰레드에게 간섭 받지 앟게 하려면 '동기화'가 필요
     * 다른 쓰레드가 간섭하지 못하게 막는 것
    - 동기화를 하려면 간섭 받지 않아야 하는 문장들을 '임계 영역'으로 설정
    - 임계 영역은 lock을 얻은 단 하나의 쓰레드만 출입가능
     * 객체 1개 당 락 1개

     


    17. synchronized를 이용한 동기화


    - synchronized로 임계영역을 설정하는 방법 2가지

     


    18. wait()과 notify()

    - 동기화의 효울을 높이기 위해서는 wait()과 notify()를 사용한다
    - Object클래스에 정의되어 있으며 동기화 블록 내에서만 사용
      * wait(): 객체의 lock을 풀고 쓰레드를 해당 객체의 waiting pool에 넣는다
      ** notify() - waiting pool에서 대기중인 쓰레드 중의 하나를 깨운다
      *** notifyAll() - waiting pool에서 대기중인 모든 쓰레드를 깨운다
      

Designed by Tistory.