스레드 간의 협력
대기 및 통지 (1)
표준 형태의 통지를 대기
에 의해 대기 :
- 객체 잠금을 가져옵니다
- 루프 판정 조건을 만족하지 통화 대기 () 메소드
- 실행 비즈니스 로직 조건이 충족된다
파티 통보 :
- 취득 목적
- 변경 조건
- 객체를 기다리는 모든 스레드를 통보
2. 대기 통보 /의 notifyAll
대기는 : 다른 thread가 현재의 싱크 모니터 호출 할 때까지, 현재의 thread의 원인 notify()
또는 notifyall()
이 스레드를 깨우는 방법. wait()
세 가지 방법이 형태입니다 - 시간 매개 변수 및 밀리 초와 나노초 매개 변수 (자동 웨이크 업 지정된 시간 후)) 밀리 초 매개 변수 (와 waut 대기 (다른 스레드의 통지 할 때까지 대기를) 기다릴
알림 : 이 동기화를 깨워 단지 활성화 스레드를 기다리고 있지만, 구현을 계속하려면 다시에 대한 잠금을 얻을 수있다;이 모니터 동기화를 기다리는 여러 스레드가있는 경우 모니터에 대기중인 단일 스레드는 만이를 임의의 스레드를 호출 즉 원래는 여전히 획득 잠금을 계속할 수 없습니다 스레드를 기다리고 있기 때문에, 한 잠금이 해제되지 않았기 때문에 말을하는 것입니다.
가는 notifyAll : 스레드의이 모니터 동기화에 대한 모든 대기 일어나 모든 스레드가 활성화됩니다.
대기 () 메소드에서 알림 () 메소드 notiftAll () 메소드
java.lang.Object
그렇지 예외 (예외 : IllegalMonitorStateException) 발생되는 공유 데이터에 대한 다중 스레드 액세스를 조정하는, 상기 방법은 오직 동기 또는 동기 블록으로 사용될 수있다.
가입 3
스레드 () 메소드 --join 완전한 실행 방법에 다른 스레드에 대한 스레드 대기 메이크 제공하며, 조인 될 때까지 프로그램이 다른 스레드에서 실행될 때 호출에 참여는 () 메서드 호출 스레드가 차단됩니다 () 메소드 조인 때까지 스레드가 완료됩니다.
static class JoinQueue implements Runnable {
private Thread thread;
public JoinQueue(Thread thread) {
this.thread = thread;
}
@Override
public void run() {
try {
thread.join();
System.out.println(Thread.currentThread().getName()+" terminted.");
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread previous = Thread.currentThread();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(new JoinQueue(previous), String.valueOf(i));
System.out.println(" thread " + previous.getName() + " is in front of " + thread.getName());
thread.start();
previous = thread;
}
Thread.sleep(2000);
System.out.println(Thread.currentThread()+" done");
}
4. 호출 수율 (), 수면 (), 대기 ()의 효과는 잠금 등) (통지
스레드 실행 수율 () 잠금을 보유 후이 해제되지 않으며,
SLEEP () 메소드가 호출 된 후, 잠금 해제에 의해 보관 유지되어 있지 않은 경우,
대기 () 스레드가 잠금을 보유해야합니다 전에 메소드가 호출되어, 통화 대기 () 방법의 경우 잠금이 해제됩니다 대기 () 다시 잠금을 수용하는 스레드 때 메서드가 반환,
호출 ) (통지 방법 전에, 그것은 잠금을 유지하는 것이 필요하다, 호출 (통지) 방법 자체가 잠금을 해제하지 않습니다 .