사진올리기 귀찮아서 글로만 쓰면 과연 누가 볼까 1호점



이미지배너

11. Thread by keispace




Thread
  1. Process: 현재 '동작하고 있는' 소프트웨어.
    1. Munti-Process: 여러 프로세스를 동시에 구동되는 상태.
      • 단, cpu는 동시에 한 가지 일밖에 하지 못하고, 운영체제에 의해 시분할(동시에 작동하는 것 처럼 작업)하는 것.
      • Multi Processor: cpu가 여러개 있는것. 듀얼, 쿼드 코어
  2. Program : 현재 동작하지 않은 상태의 소프트웨어
  • Thread: 하나의 프로그램 안에서 실행 가능한 작업 단위
    • 멀티 쓰레드라 하더라도 동시에 작동되는 것 처럼 보일 뿐, 하나의 프로세스가 작업하는 것.
    • 쉽게 말해서 농장게임에서 일꾼의 수. 일꾼이 한명이면 싱글 쓰레드, 두명이상이면 멀티 쓰레드.(100%일치하진 않음)
    • Thread가 없는 프로그램은 존재치 않음. (java는 main()이 하나의 쓰레드)
    • Java는 자체적으로 쓰레드를 구현할 수 있으므로 운영체제에 대한 이해도 요구가 낮음.
      • Thread Class 상속
**생성된 run()은 쓰레드가 아니라 단지 메서드임.
** strat()가 하는 일: 스택생성, run()을 생성된 스택에 실행.

        • 실행 순서등을 정하는 것을 스케줄 관리라고 함.
        • 쓰레드를 잠시 쉬게 하여 다른 쓰레드를 실행되도록 하는 방법으로 관리 가능.
          • 프로그램 실행속도 제어, 쓰레드 실행등을 제어 할 수 있음.
        • 데이터를 부모 쓰레드에 저장할 수 있다.
        • 이름 값 생성 없이도 이름, 자체 아이디를 호출 가능
          • 굳이 쓰레드 호출에 이름을 적지 않아도 Thread-0, -1 등으로 이름이 구분됨

      • Runnable Interface 구현


    • 예제. 별도 클래스로 만들기
      • 문제는 메인 쓰레드가 실행종료 된 후에 호출된 자식 쓰레드가 일함.
      • 따라서 스케줄 조정이 필요함.(각 쓰레드의 sleep 명령)
        • 시간 조정으로 쓰레드의 작업시간을 조절할 수 있음.
    • 위 내용을 생성자를 이용한 실행토록 해서 Runnable 구현으로 변경

**Runnable 구현과 Thread 상속의 코딩 상 차이점.(Runnable 기준)
(Runnable 인터페이스: run()만 정의되어있음.)
편한점
1. 자바 단일 상속, 다중 구현이므로 기능상 타 클래스의 상속을 받는 경우의 대안이 됨.
불편한점
1. Thread클래스의 스태틱 멤버만을 호출 가능. ex) Thread.sleep(int n)등
2. start()는 스태틱 멤버가 아니므로 Thread 인스턴스를 생성하여 간접 실행해야 함.




  • Thread의 Lifecycle
    • stop(): 즉시 강제종료함Deprecated -> flag로 대체(종료 되도록 요청. interrupt())
    • suspend(): 다시 깨우기 전까지 정지됨Deprecated -> sleep()으로 대체(시간이 되면 자동 시작)
      • resume(): suspend()로 정지된 쓰레드를 깨움Deprecated->time-out(시간 종료)
    • block: 시스템에서 알아서 시작, 정지를 함.
    • wait(): 여러개의 쓰레드가 다시 깨우기 전까지 정지. Syncronized(동기화) 처리 용.
      • 동기화된 장기 작업을 처리할 때에 해당 쓰레드들의 스케쥴을 처리하기 위함.
        • ex) 자판기에 음료가 없을 때 음료 사러온 쓰레드들은 wait() 후 음료 채우는 쓰레드가 음료를 채운 다음, 음료 사러온 쓰레드들에 notify()/notifyAll()
      • notify()/notifyAll(): wait()에 의해 정지된 쓰레드를 순서대로/전부 깨움.
    • Thread의 종료시점(ThreadTest4.java)
      • 프로그램 흐름 상 마지막에 끝나는 쓰레드(엔딩 출현 조건 등)가 고정되어 있어야 하는 경우(통상 main()이 가장 마지막에 끝나는 것이 바람직) Thread 종료를 유도하여야 함.
        • isAlive()(정상종료)
          • Thread가 살아있는지(작업중인지) 확인. 
          • main에서 자식 Thread의 작업여부를 확인 한 후에 종료(수동)하는 방식으로 작동.
        • join()(정상종료)
          • join()으로 연결된 Thread가 종료되면 자동으로 종료하는 방식.

        • stop(): 즉시 강제종료함(현재 작업 중단됨). 작업 오류 발생문제가 있어서 Deprecated
        • intrrupt(): 시스템에게 해당 작업을 강제 종료하라고 지시
        • Flag : 직접 종료 시점 지정방식(안드로이드 통상 쓰레드 관리 방식)

과제1. 쓰레드 활용 입력 숫자 합계 구하기.









덧글

  • 고다르 2015/04/03 10:47 # 삭제 답글

    사진이 다 깨졌네요.
    링크를 에버노트로 해놓으신거 같은데
    그럼 본인만 볼수 있을텐데..
    그게 목적이시면 아예 글을 비공개로 하심이..
  • keispace 2015/04/09 14:26 #

    시험삼아 에버노트 공개링크를 통해서 올려봤는데 안되겠네요 ㅋㅋㅋ 감사합니다 수정했습니다
댓글 입력 영역

와이드리더보드