자바 동시 프로 그래 밍 wait, notify, notify All 및 Condition

、wait、notify、notifyAll
1.1 방법 소개
1) 특정한 대상 의 wait() 방법 을 호출 합 니 다. , , (Thread 류 의 sleep 방법 은 현재 스 레 드 를 일정 시간 동안 실행 하지 않 고 다른 스 레 드 를 계속 실행 할 수 있 도록 합 니 다. 그러나 대상 자 물 쇠 를 풀 지 않 습 니 다)대상 의 wait () 방법 을 호출 하면 현재 스 레 드 는 이 대상 의 자 물 쇠 를 가 져 야 하기 때문에 wait () 방법 은 동기 블록 이나 동기 화 방법 에서 진행 되 어야 합 니 다 (synchronized 블록 또는 synchronized 방법).2) notify() 방법 은 대상 의 자 물 쇠 를 기다 리 고 있 는 스 레 드 를 깨 울 수 있 습 니 다. 여러 스 레 드 가 대상 의 자 물 쇠 를 기다 리 고 있 으 면 그 중의 한 스 레 드 만 깨 울 수 있 고 어떤 스 레 드 를 깨 울 지 는 알 수 없습니다.대상 의 notify () 방법 을 호출 합 니 다. 현재 스 레 드 에 도 이 대상 의 잠 금 이 있어 야 합 니 다. 따라서 notify () 방법 을 호출 하려 면 동기 블록 이나 동기 화 방법 에서 진행 해 야 합 니 다 (synchronized 블록 또는 synchronized 방법).3) notifyAll() 방법 은 이 대상 을 기다 리 고 있 는 모든 자 물 쇠 를 깨 울 수 있 으 며, 결국 누가 자 물 쇠 를 가 져 올 지 알 수 없다.어떤 대상 의 notifyAll () 방법 으로 현재 스 레 드 에 도 이 대상 의 잠 금 이 있어 야 하기 때문에 notifyAll () 방법 을 호출 하려 면 동기 블록 이나 동기 화 방법 에서 진행 해 야 합 니 다 (synchronized 블록 또는 synchronized 방법). : 한 스 레 드 가 깨 어 난 것 은 대상 의 자 물 쇠 를 즉시 가 져 온 것 이 아 닙 니 다. notify () 또는 notify All () 을 사용 하고 synchronized 블록 을 종료 하고 대상 자 물 쇠 를 풀 어야 나머지 스 레 드 가 잠 금 을 실행 할 수 있 습 니 다.
1.2 관련 방법
방법 이름
묘사 하 다.
wait()
이 방법 을 호출 한 스 레 드 는 WAITING 상태 로 들 어가 서 다른 스 레 드 의 알림 을 기다 리 거나 중단 되 어야 돌아 올 수 있 습 니 다. wait () 방법 을 호출 하면 대상 의 자 물 쇠 를 풀 수 있 습 니 다.
wait(long)
시간 을 초과 하여 일정 시간 을 기 다 립 니 다. 여기 있 는 매개 변 수 는 밀리초 입 니 다. 즉, n 밀리초 를 기다 리 는 것 입 니 다. 알림 이 없 으 면 시간 을 초과 하여 돌아 갑 니 다.
wait(long, int)
시간 초과 에 대한 보다 세밀 한 제어 가 밀리초 에 이 를 수 있다.
notify()
대상 에서 기다 리 는 스 레 드 를 wait () 에서 되 돌려 주 고 돌아 오 는 전 제 는 이 스 레 드 가 대상 의 자 물 쇠 를 가 져 오 는 것 입 니 다.
notifyAll()
이 대상 을 기다 리 는 모든 스 레 드 를 알려 줍 니 다.
1.3 예시
public class Test {
     

    Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
     
        Test test = new Test();

        Runnable runnable1 = new Runnable() {
     
            @Override
            public void run() {
     
                test.await(); //      
            }
        };

        Runnable runnable2 = new Runnable() {
     
            @Override
            public void run() {
     
                test.anotify(); //       
            }
        };

        Thread thread1 = new Thread(runnable1);
        Thread thread2 = new Thread(runnable2);
        thread1.start();
        thread2.start();
    }

    public void await() {
     
        synchronized (lock) {
     
            try {
     
                System.out.println(Thread.currentThread().getName() + ":      ");
                lock.wait();
                System.out.println("    ...");
            } catch (InterruptedException e) {
     
                e.printStackTrace();
            }

        }
    }

    public void anotify() {
     
        synchronized (lock) {
     
            try {
     
                System.out.println("10        ...");
                TimeUnit.SECONDS.sleep(10);
                lock.notify();
            } catch (InterruptedException e) {
     
                e.printStackTrace();
            }
        }
    }

}
、Condition
2.1 소개
모든 자바 대상 은 Object 류 에 천연 적 으로 계승 되 고 온라인 에서 통신 을 실현 하 는 것 은 Object 에 응용 되 는 몇 가지 방법, 예 를 들 어 wait (), wait (long timeout), wait (long timeout, int nanos) 와 notify (), notify All () 몇 가지 방법 으로 실현 되 는 등 대기 / 알림 체제 와 마찬가지 로 자바 Lock 시스템 에서 도 같은 방법 으로 대기 / 알림 체 제 를 실현 할 수 있 습 니 다.전체적으로 볼 때 Object 의 wait 와 notify / notify 는 대상 모니터 와 결합 하여 스 레 드 간 의 대기 / 알림 체 제 를 완성 하 는 것 이 고 Condition 과 Lock 은 대기 알림 체 제 를 완성 하 는 것 입 니 다. 전 자 는 자바 바 텀 등급 이 고 후 자 는 언어 등급 이 며 더욱 높 은 통제 성과 확장 성 을 가지 고 있 습 니 다.두 가 지 는 사용 방식 이 다른 것 을 제외 하고 기능 특성 에 있어 많은 차이 가 있다.
  • Condition 은 인 터 럽 트 에 응답 하지 않 고 Object 방식 으로 지원 하지 않 는 것 을 지원 할 수 있 습 니 다.
  • Condition 은 여러 대기 열 (new 여러 condition 대상) 을 지원 할 수 있 으 며, Object 방식 은 하나만 지원 할 수 있 습 니 다.
  • Condition 은 시간 초과 설정 을 지원 할 수 있 지만 Object 는 지원 하지 않 습 니 다
  • 2.2 선 관문 방법
    방법.
    묘사 하 다.
    await()
    현재 스 레 드 가 신 호 를 받 거나 중단 되 기 전에 대기 상태 에 있 습 니 다.
    await(long time, TimeUnit unit)
    현재 스 레 드 가 신 호 를 받 거나 중단 되 거나 지정 한 대기 시간 에 도달 하기 전에 대기 상태 에 있 습 니 다.
    awaitNanos(long nanosTimeout)
    현재 스 레 드 가 신 호 를 받 거나 중단 되 거나 지정 한 대기 시간 에 도달 하기 전에 대기 상태 에 있 습 니 다.반환 값 은 남 은 시간 을 표시 합 니 다. nanosTimesout 전에 깨 우 면 반환 값 = nanosTimeout - 시간 을 소모 합 니 다. 반환 값 < = 0 이면 시간 이 초과 되 었 음 을 인정 할 수 있 습 니 다.
    awaitUninterruptibly()
    현재 스 레 드 가 신 호 를 받 기 전에 대기 상태 에 있 습 니 다.[주의: 이 방법 은 중단 에 민감 하지 않 습 니 다].
    awaitUntil(Date deadline)
    현재 스 레 드 가 신 호 를 받 거나 중단 되 거나 지 정 된 최종 기한 에 도달 하기 전에 대기 상태 에 있 습 니 다.지정 한 시간 이 되 지 않 으 면 true 로 돌아 갑 니 다. 그렇지 않 으 면 지정 한 시간 이 되 었 음 을 표시 하고 false 로 돌아 갑 니 다.
    signal()
    대기 스 레 드 를 깨 웁 니 다.이 스 레 드 는 대기 방법 에서 돌아 오기 전에 Condition 과 관련 된 자 물 쇠 를 가 져 와 야 합 니 다.
    signalAll()
    모든 대기 라인 을 깨 웁 니 다.대기 방법 으로 돌아 갈 수 있 는 스 레 드 는 Condition 과 관련 된 자 물 쇠 를 가 져 와 야 합 니 다.
    2.3 예시
    public class Test {
         
        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
    
        public static void main(String[] args) throws InterruptedException {
         
            Test test = new Test();
    
            Runnable runnable1 = new Runnable() {
         
                @Override
                public void run() {
         
                    test.await(); //      
                }
            };
    
            Runnable runnable2 = new Runnable() {
         
                @Override
                public void run() {
         
                    test.anotify(); //       
                }
            };
    
            Thread thread1 = new Thread(runnable1);
            Thread thread2 = new Thread(runnable2);
            thread1.start();
            thread2.start();
        }
    
        public void await() {
         
            lock.lock();
            try {
         
                System.out.println(Thread.currentThread().getName() + ":      ");
    
                condition.await();
    
                System.out.println("    ...");
            } catch (InterruptedException e) {
         
                e.printStackTrace();
            } finally {
         
                lock.unlock();
            }
        }
    
        public void anotify() {
         
            lock.lock();
            try {
         
                System.out.println("10        ...");
    
                TimeUnit.SECONDS.sleep(10);
    
                condition.signal();
            } catch (InterruptedException e) {
         
                e.printStackTrace();
            } finally {
         
                lock.unlock();
            }
        }
    
    }
    

    대비 항
    Object Monitor Methods
    Condition
    선행 조건
    대상 의 자물쇠 가 져 오기
    Lock. lock () 을 호출 하여 자물쇠 가 져 오기 Lock. newCodition () 을 호출 하여 Condition 대상 가 져 오기
    호출 방법
    다음 과 같이 직접 호출: Object. wait ()
    다음 과 같이 직접 호출: condition. wait ()
    대기 열 개수
    한 개
    여러 개
    현재 스 레 드 잠 금 해제 대기 상태
    지지 하 다.
    지지 하 다.
    현재 스 레 드 에서 잠 금 을 풀 고 대기 상태 에 들 어 갑 니 다. 대기 상태 에서 인 터 럽 트 에 응답 하지 않 습 니 다.
    지지 하 다.
    현재 스 레 드 잠 금 해제 및 시간 초과 대기 상태 진입
    지지 하 다.
    지지 하 다.
    현재 스 레 드 에서 자 물 쇠 를 풀 고 대기 상태 로 들 어 갑 니 다.
    지지 하 다.
    대기 열 에 있 는 스 레 드 를 깨 웁 니 다.
    지지 하 다.
    지지 하 다.
    대기 열 에 있 는 모든 스 레 드 를 깨 웁 니 다.
    지지 하 다.
    지지 하 다.

    좋은 웹페이지 즐겨찾기