wait()와 notify()를 이해 하 는 예

4251 단어 thread
다음은 제 가 원래 CSDN 포럼 에서 본 스티커 입 니 다.동기 화,wait(),notify()등 개념 에 대한 이해 와 관련 되 어 있 습 니 다.저 는 원래 의 답장 과 Think in Java 의 관련 개념 에 따라 wait()와 notify()두 가지 방법 을 분석 해 보 았 습 니 다.지 도 를 환영 합 니 다.
문 제 는 다음 과 같다.
이 프로그램 을 분석 하고 설명 하 며 synchronized,wait()에 중심 을 두 고 notify 감사합니다!
class ThreadA 
{
  public static void main(String[] args) 
  {
    ThreadB b=new ThreadB();
    b.start();
    System.out.println("b is start....");
    synchronized(b)//    b     ,     ?
    {
      try
      {
 System.out.println("Waiting for b to complete...");
 b.wait();//        ,    wait?
        System.out.println("Completed.Now back to main thread");
      }catch (InterruptedException e){}
    }
    System.out.println("Total is :"+b.total);
   }
}
 
class ThreadB extends Thread
{
  int total;
  public void run()
  {
    synchronized(this)
    {
      System.out.println("ThreadB is running..");
      for (int i=0;i<100;i++ )
      {
        total +=i;
        System.out.println("total is "+total);
      }
      notify();
    }
  }
}

 이 프로그램 을 분석 하려 면 먼저 notify()와 wait()를 이해 해 야 한다.왜 며칠 전에 스 레 드 를 기록 할 때 이 두 가지 방법 을 기록 하지 않 았 을 까?이 두 가지 방법 은 원래 Thread 류 가 아니 라 최 하층 object 기초 류 에 속 하기 때문이다.즉,Thread 뿐만 아니 라 모든 대상 에 notify 와 wait 기능 이 있 기 때문이다.왜?그들 은 자 물 쇠 를 조종 하 는 데 사용 되 기 때문에 모든 대상 에 게 자물쇠 가 있 고 자 물 쇠 는 모든 대상 의 기초 이다.자물쇠 가 기본 적 인 것 이 라면 자 물 쇠 를 조종 하 는 방법 도 당연히 가장 기본 적 인 것 이다.
 
 아래 를 내 려 다 보기 전에 먼저 Think in Java 의 14.3.1 중 세 번 째 부분 을 복습 하 는 것 이 좋 습 니 다.기다 림 과 알림,즉 wait()와 notify 입 니 다.
Think in Java 의 설명 에 따 르 면"wait()는 스 레 드 를"수면"상태 에 넣 는 동시에"적 극 적"으로 조건 이 바 뀌 기 를 기다 릴 수 있 습 니 다.또한 하나의 notify()나 notify All()이 바 뀌 었 을 때 만 스 레 드 가 깨 어 나 고 항목 이 바 뀌 었 는 지 확인 할 수 있 습 니 다."
  우리 이 말 을 설명해 봅 시다.
  "wait()는 스 레 드 를'수면'상태 로 설정 할 수 있 습 니 다.즉,wait 도 현재 스 레 드 를 막 는 것 입 니 다.이 점 은 sleep 또는 suspend 와 같 습 니 다.sleep,suspend 와 어떤 차이 가 있 습 니까?
 
   차이 점 은'(wait)과'적 극 적'으로 조건 이 바 뀌 기 를 기다 리 는 것'이다.이 점 이 관건 이다.sleep 와 suspend 는 할 수 없다.동기 화(synchronized)의 도움 을 통 해 스 레 드 간 의 충돌 을 방지 해 야 할 때 가 있 기 때문이다.동기 화 를 사용 하면 대상 자 물 쇠 를 잠 그 는 것 이다.이 대상 자 물 쇠 를 사용 해 야 하 는 다른 스 레 드 는 줄 을 서서 기다 릴 수 밖 에 없다.동기 화 방법 이나 동기 화 블록 에 있 는 프로그램 이 모두 실 행 될 때 까지 기 회 를 가 질 수 있 습 니 다.동기 화 방법 과 동기 화 블록 에 서 는 sleep()이 든 suspend()든 자신 이 호출 될 수 없 을 때 잠 금 을 해제 합 니 다.그들 은 사용 하고 있 는 대상 의 잠 금 을 강점 하고 있 습 니 다.
   wait 는 동기 화 방법 이나 동기 화 블록 을 대상 자 물 쇠 를 잠시 포기 하고 대상 자 물 쇠 를 필요 로 하 는 다른 사람 에 게 잠시 양보 할 수 있 습 니 다.이것 은 wait()를 실행 하 는 동안 스 레 드 대상 의 다른 동기 화 방법 을 호출 할 수 있 음 을 의미 합 니 다!다른 상황 에 서 는(sleep 아,suspend 아)불가능 합 니 다.
   하지만 앞에서 말 한 것 을 주의 하 세 요.대상 자 물 쇠 를 잠시 포기 하고 다른 스 레 드 에 잠시 사용 할 뿐 입 니 다.제 wait 가 있 는 스 레 드 는 이 대상 자 물 쇠 를 되 찾 아야 합 니 다.wait 뭐라고 요?남 이 다 쓸 때 까지 기 다 렸 다가 돌려 주 는 거 야!
   좋아,그럼 어떻게 대상 자 물 쇠 를 되 찾 지?
   첫 번 째 방법 은 빌려 주 는 시간 을 제한 합 니 다.wait()에 파 라 메 터 를 설정 합 니 다.예 를 들 어 wait(1000)는 밀리초 단위 로 제 가 1 초 만 빌려 주 고 1 초 후에 제 가 자동 으로 회수 하 는 것 을 나타 냅 니 다.
   두 번 째 방법 은 빌려 준 사람 에 게 그 가 다 써 서 나 에 게 돌려 주 겠 다 고 알려 달라 고 했다.이때 나 는 곧 회수 할 것 이다.아,만약 내 가 1 시간 후에 회수 할 것 을 설정 했다 면 다른 사람 은 30 분 만 에 끝 났 을 것 이다.그러면 어떻게 하지?믿 어!당연히 다 쓰 면 회수 하지,내 가 얼마나 설치 하 든 상관 없어.
 
   그럼 어떻게 알려 주 시 는 거 예요?모두 가 생각 할 수 있 을 거 라 고 믿 습 니 다.notify(),이것 이 바로 마지막 말 입 니 다."그리고 하나의 notify()나 notify All()이 변화 할 때 만 스 레 드 가 깨 어 납 니 다."
   따라서 저 희 는 wait()와 notify()를 동기 화 방법 이나 동기 화 블록 내부 에 넣 을 수 있 습 니 다.그 종류 에서 스 레 드 와 관련 된 처 리 를 준비 하 든 말 든.그리고 실제로 우 리 는 동기 화 방법 이나 동기 화 블록 에서 wait()와 notify()를 호출 할 수 밖 에 없습니다.
 
   이때 우리 가 위의 절 차 를 설명 하 는 것 은 정말 식 은 죽 먹 기다.
 
   synchronized(b){...};동기 블록 을 정의 하고 b 를 자원 자물쇠 로 사용 한 다 는 뜻 이다.b.wait();잠 금 을 일시 적 으로 풀 고 현재 스 레 드(즉,여기 의 메 인 스 레 드,b 의 스 레 드 를 호출 합 니 다.예 를 들 어 제 가 좀 쉬 고 싶 습 니 다.b 자 물 쇠 를 가 진 사람 에 게 실행 하 게 하고 싶 습 니 다)를 막 습 니 다.같은 자 물 쇠 를 사용 하 는 다른 스 레 드 가 실 행 될 수 있 도록 하 는 것 은 b 스 레 드 자체 입 니 다.이 스 레 드 는 일정한 곳 에 실 행 된 후에 notify()로 wait 의 스 레 드 를 알 립 니 다.잠 금 이 다.notify()가 있 는 동기 블록 이 실 행 된 후에 wait 가 있 는 스 레 드 는 계속 실 행 될 수 있 습 니 다.

좋은 웹페이지 즐겨찾기