Java 스레드 - sleep, wait 및 notify의 차이점

두 방법 모두 sleep()wait() 현재 스레드를 일시 중지하고 일정 시간 후 또는 다른 프로세스에 의해 트리거된 알림 후 실행 경로를 다시 시작합니다.

wait 알림wait et 알림 블록에서 호출됩니다 동기화  상호 배제에 사용됩니다. 방법  알림 wait.

wait() 및 notify()의 예

이 프로그램에서 프로세스 B는 프로세스 A 내에서 실행되며 프로세스 A가 블록 후 명령문을 실행하지 못하도록 상호 제외 영역을 만듭니다. try/catch.

public class Thread_A {
public static void main(String[] args) {

스레드 Thread_B = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
int i=0;
동안(i< 100)
i++;
//자유 스레드 A
notify();
}
}
});
Thread_B.start()를 호출합니다.

synchronized(Thread_B) {
try {
System.out.println("스레드 A가 차단됨 - 스레드 B 대기 중"+
"완료");
//A
Thread_B.wait();
} catch (InterruptedException e) {
// TODO 자동 생성 catch block
e.printStackTrace();
}
System.out.println("스레드 B가 완료되었습니다 - 스레드 A가 해제되었습니다.");
}
}
}
Output
스레드 A가 멈췄습니다. 스레드 B가 완료되기를 기다리는 중
스레드 B가 완료되었습니다. 스레드 A가 해제되었습니다

sleep()의 예

sleep()은 프로세스를 잠그고 설정된 시간 동안 실행합니다. 이 방법은 시간과 동기화하거나(예: 4초 후 깨우기) sleep을 말하고 다른 스레드를 실행하는 데 사용됩니다.

public class Sleep {

public static void main(String[] args) {
ThreadA a = new ThreadA();
a.start();
ThreadB b = 새로운 ThreadB();
b.start();
}

정적 클래스 ThreadA extends Thread{
@Override
public void run() {
try {
System.out.println("스레드 A");
수면(4000);
System.out.println("스레드 A: 4초 동안 잤습니다.");
} catch (InterruptedException e) {
// TODO 자동 생성 catch block
e.printStackTrace();
}
}
}

정적 클래스 ThreadB extends Thread{
@Override
public void run() {
System.out.println("스레드 B");
int 합계 = 0;
for(int i = 0 ; i < 50; i++)
sum +=i;
System.out.println("스레드 B: 완료");
}
}
}
Output
스레드 A
스레드 B
스레드 B: 완료했습니다
스레드 A: 4초 동안 잤습니다
프로세스 A는 프로세스 B보다 먼저 시작되었지만 B는 프로세스 A가 진행되는 동안 처리를 수행했습니다. 자고 있었고 첫 번째