자바 동시 프로 그래 밍 wait, notify, notify All 및 Condition
22741 단어 Java대열다 중 스 레 드자바병렬 프로 그래 밍
、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 은 대기 알림 체 제 를 완성 하 는 것 입 니 다. 전 자 는 자바 바 텀 등급 이 고 후 자 는 언어 등급 이 며 더욱 높 은 통제 성과 확장 성 을 가지 고 있 습 니 다.두 가 지 는 사용 방식 이 다른 것 을 제외 하고 기능 특성 에 있어 많은 차이 가 있다.
방법.
묘사 하 다.
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 ()
대기 열 개수
한 개
여러 개
현재 스 레 드 잠 금 해제 대기 상태
지지 하 다.
지지 하 다.
현재 스 레 드 에서 잠 금 을 풀 고 대기 상태 에 들 어 갑 니 다. 대기 상태 에서 인 터 럽 트 에 응답 하지 않 습 니 다.
지지 하 다.
현재 스 레 드 잠 금 해제 및 시간 초과 대기 상태 진입
지지 하 다.
지지 하 다.
현재 스 레 드 에서 자 물 쇠 를 풀 고 대기 상태 로 들 어 갑 니 다.
지지 하 다.
대기 열 에 있 는 스 레 드 를 깨 웁 니 다.
지지 하 다.
지지 하 다.
대기 열 에 있 는 모든 스 레 드 를 깨 웁 니 다.
지지 하 다.
지지 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.