Java 멀티스레드 프로그래밍 (제3장)

3482 단어

1. 스레드 간 통신


스레드 간 통신 및 공동 작업 가능
  • wait() 방법의 역할은 현재 실행 코드의 라인을 기다리게 하는 것이다.wait() 방법은 Object 클래스의 방법으로wait() 방법이 있는 코드 줄에서 알림을 받거나 중단될 때까지 실행을 정지한다. wait() , , 즉 동기화 방법이나 동기화 블록에서wait() 방법만 호출할 수 있다.wait () 방법을 실행하면 현재 라인에서 자물쇠를 방출합니다.
  • notify () 방법도 동기화 방법이나 동기화 블록에서 호출해야 한다. 즉, 호출하기 전에 라인은 이 대상의 자물쇠를 받아야 한다.
  • 루틴이 Runnable(준비) 상태에 들어간 경우
  • sleep() 방법을 호출한 후 지정된 휴면시간
  • 을 초과하였습니다.
  • 스레드 호출의 차단 IO가 되돌아왔습니다. 차단 방법 실행 완료
  • 스레드가 대상의 자물쇠를 성공적으로 획득
  • 스레드가 알림을 기다리고 있습니다. 다른 스레드가 알림을 보냈습니다
  • Blocked 차단 상태 발생
  • 스레드 호출sleep() 방법, 점용된 프로세서 자원을 자발적으로 포기
  • 스레드가 막힌 IO 방법을 호출하였습니다. 이 방법이 되돌아오기 전에 이 스레드가 막혔습니다
  • 라인에서 대상의 자물쇠를 얻으려고 시도했지만, 이 자물쇠는 다른 라인에 보유되어 있음
  • 스레드가 알림을 기다리고 있음
  • 자물쇠 대상마다 두 개의 대기열이 있는데 하나는 준비된 대기열이고 하나는 막힌 대기열이다.준비된 대기열은 자물쇠를 얻을 라인을 저장하고, 대기열은 막힌 라인을 저장합니다.
  • wait 자물쇠 방출, notify 자물쇠 방출하지 않음
  • 라인이wait상태일 때 라인 대상의interrupt() 방법을 호출하면 이상
  • interrupted    :      (current thread)       ,          ,  false。
    isInterrupted    :     Thread  (this thread)       ,        。
  • notify는 랜덤으로 한 라인만 깨우고, notifyAll은 모든 라인을 깨운다
  • wait(long timeout)는 일정 시간 동안 라인이 알림을 보낼지 기다리고 이 시간을 초과하면 자동으로 깨웁니다
  • wait를 기다리는 조건이 바뀌면 절차가 바뀔 수 있으므로while로 조건을 판단
  • 생산자/소비자 모델
  • 생산자 한 명, 소비자 한 명
  • 여러 생산자, 여러 소비자,'가짜 죽음'의 현상은 사실 모든 라인이 WAITING 대기 상태에 들어가 해결용while와 notifyAll
  • 한 생산자, 여러 소비자
  • 여러 생산자, 한 소비자

  • 2. 파이프를 통해 라인 간 통신


    파이프 흐름(pipe Stream)은 서로 다른 라인 사이에서 데이터를 직접 전송하는 특수한 흐름이다.한 라인은 데이터를 출력 파이프에 보내고, 다른 라인은 입력 파이프에서 데이터를 읽는다.1. PipedInputStream 및 PipedOutStream 2.PipedReader 및 PipedWriter
    PipedInputStream inputStream = new PipedInputStream();
    PipedOutputStream outputStream = new PipedOutputStream();
    inputStream.connect(outputStream);//    

    3. 방법join의 사용

  • join의 역할은 라인 대상 소각을 기다리는 것이다
  • join은 내부에서wait()방법으로 대기하기 때문 의특징
  • 방법join()과interrupt() 방법이 만나면 이상
  • 을 던집니다.
  • join(long timeout) 대기 시간 설정
  • 특수상황: b.join(2000)방법으로 먼저 B 자물쇠를 뺏은 다음에 B 자물쇠를 방출
  • thread.join()

    4. ThreadLocal 사용


    모든 라인은 자신의 공유 변수를 가지고 있다.ThreadLocal 클래스는 변수가 서로 다른 라인 사이의 격리성을 해결하고 서로 다른 라인은 자신의 값을 가진다.
    ThreadLocal<Date> local = new ThreadLoacl<>();
    //  initalValue()  ,         

    5. InheritableThreadLocal 사용


    역할은 하위 루틴이 부모 루틴에서 값을 얻는 것입니다. - Inheritable ThreadLocal 클래스를 사용하면 하위 루틴이 값을 얻는 동시에 메인 루틴이 Inheritable ThreadLocal의 값을 수정하면 하위 루틴이 얻은 값은 옛날 값입니다.
    //  childValue(Object parentValue)             

    좋은 웹페이지 즐겨찾기