728x90
sleep() 과 wait() 의 차이점
sleep()
- Thread.sleep() 은 java.lang.Tread 클래스의 정적 메서드로, 현재 실행 중인 스레드를 일시적으로 지연시키는데 사용됨
- sleep() 은 주로 프로그램의 특정 시간 동안 지연을 발생시키기 위해 사용됨
- 예 ) 주어진 시간 동안 대기하고 일정 시간마다 작업을 수행하는 등의 기능을 구현할 때 유용함
- 인터럽트가 발생하거나 지정된 시간이 경과하면 스레드가 실행을 재개함
- 락을 해제하지않아 다른 스레드가 해당 스레드가 사용 주아니 공유 자원에 접근할 수 없음
try {
// 5초 동안 현재 스레드를 일시 중지합니다.
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
wait()
- Object.wait() 메서드는 모든 객체의 인스턴스 메서드로, 스레드 간의 동기화를 위해 사용됨
- wait() 은 특정 조건이 충족될 때까지 스레드를 일시 중지시키는데 사용됨
- 대기 중인 스레드는 다른 스레드가 락을 해제하고 'notify()' 또는 'notifyAll()' 메서드를 호출하여 신호를 보낼때 까지 기다림
- wait() 은 반드시 synchronized 블록 내에서 호출되어야함. 그렇지 않으면 'IllegalMonitorStateException' 이 발생
- wait() 은 다른 스레드에게 락을 양보하고, 해당 객체의 락을 잃게됨
Object sharedResource = new Object();
// synchronized 블록 안에서 wait() 호출
synchronized (sharedResource) {
try {
// 조건이 충족될 때까지 현재 스레드를 일시 중지하고 락을 양보합니다.
sharedResource.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify() 와 notifyAll() 의 차이점
공통점
Java 에서 스레드 간의 동기화를 위해 사용되는 메서드로, Object 클래스의 인스턴스 메서드임
notify()
- notity() 는 대기 중인 하나의 스레드를 깨운다
- 호출한 객체가 락을 보유하고 있는 스레드 중 하나가 'wait()'로 인해 대기 중인 상태라면, 그 중하나의 스레드가 임의로 선택되어 실행을 재개한다.
- 선택되는 스레드는 보장 되지 않으며, 어떤 스레드가 깨어날지 정확히 예측할 수 없다
- 만약 대기 중인 스레드가 없다면, notity() 호출은 아무 작업도 수행하지 않는다
notifyAll()
- notifyAll() 은 대기 중인 모든 스레드를 깨운다
- 호출한 객체의 락을 보유하고 있는 스레드 중 대기 중인 모든 스레드들이 실행을 재개한다.
- notifyAll() 조건을 사용하면 모든 대기 중인 스레드가 깨어날 수 있으므로, 모든 스레드가 자신의 조건을 다시 확인하고 필요한 작업을 수행해야한다.
요약
notify() 는 대기 중인 스레드 중 하나를 임의로 선택하여 깨우는 반면,
notifyAll() 은 모든 대기 중인 스레드를 깨웁니다. 상황에 따라 적절히 선택하여 스레드 간의 동기화를 구현하는 것이 중요합니다.
notify() 와 notifyAll() 은 주로 wait() 과 함께 사용된다
wait() 메서드는 특정 조건이 충족될 때까지 스레드를 대기 상태로 만든다
다른 스레드는 해당 조건을 만족시키고, 작업을 완료한 후에 notity() 또는 notifyAll() 을 호출하여 대기 중인 스레드에게 신호를 보내어 실행을 재개시킨다.
public class Main {
public static void main(String[] args) {
SharedResource resource = new SharedResource();
Thread thread1 = new Thread(() -> {
synchronized (resource) {
try {
resource.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (resource) {
try {
resource.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread3 = new Thread(() -> {
resource.work();
});
thread1.start();
thread2.start();
// Adding a delay to ensure threads 1 and 2 are in wait state before thread 3 starts.
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread3.start();
}
static class SharedResource {
synchronized void work() {
System.out.println("Working...");
notifyAll();
}
}
}
728x90
'3.multi-threading' 카테고리의 다른 글
thread run()과 tnread start()의 차이 / 스레드가 필요한 상황 - 쇼핑몰웹 예시 (0) | 2023.07.31 |
---|---|
스레드의 여러가지 상태 (0) | 2023.07.26 |
runnable과 callable의 차이는 ? (0) | 2023.07.25 |
데몬 스레드란? / 스레드를 만드는 방법 (0) | 2023.07.24 |
스레드와 프로세스의 차이 (0) | 2023.07.21 |