목차
- 자바 소스 코드 컴파일 명령 javac 예제 이전 포스팅
- 자바 화면 출력 메소드 System.out.println 예제 이전 포스팅(ReentrantLock)
- 자바 스레드 lock, unlock 예제 이전 포스팅
- 자바 wait, notify로 서로 다른 스레드의 이벤트 대기 예제
자바 소스 코드 컴파일 명령 javac 예제 이전 포스팅
오늘은 자바에서 wait 및 notify 메소드로 특정 이벤트가 발생할 때 까지 기다리고 그리고 이벤트가 발생햇다는 것을 알려주는 방법에 대해 알아보도록 하겠습니다. 자바에서는 기본적으로 제공하는 메소드중에 wait(), notify()가 있습니다. 이 둘은 한 세트로 같이 움직이는 메소드입니다.
예를들어, 한쪽 스레드에서 wait를 부르면 순간 멈추면서 기다립니다. 그리고 다른 스레드에서 notify를 호출하면 wait가 풀리면서 뒤에 코드들이 실행됩니다. 이와같이 이벤트가 발생할 때까지 기다리게하고 이벤트가 발생한 것을 알려주는 역할을 합니다.
오늘 예제를 실행하기 위해서는 javac 명령으로 자바 소스 코드를 컴파일해야합니다. 아직 컴파일 방법을 모르신다면 아래 이전 포스팅 링크를 참고하여 학습해주세요.
2023.08.10 - [Linux] - [Linux/Java] 리눅스 우분투에서 java 컴파일 및 실행 예제(javac)
자바 화면 출력 메소드 System.out.println 예제 이전 포스팅
오늘 예제가 잘 동작하는지 확인하기 위해서는 콘솔에 로그를 출력해야합니다. 자바에서 로그를 출력하기 위한 메소드로는 System.out.println 메소드가 있습니다. 오늘 예제에서도 이 메소드를 사용하여 결과를 확인하도록 하겠습니다. 아직 해당 메소드에 대해 잘 모르신다면 아래 링크를 통해 학습해주세요.
2023.08.11 - [Java] - [Java/Linux] System.out.println 문자열 출력 및 활용 예제(개행 및 정수 출력)
자바 스레드 lock, unlock 예제 이전 포스팅(ReentrantLock)
또한 이전 포스팅에서 스레드간 동기화를 위한 Lock, UnLock 메소드 사용법에 대해서도 알아보았습니다. 오늘 알아볼 wait, notify는 이벤트를 대기하고 발생한 것을 알려주는 역할을 합니다. lock, unlock은 개발자가 강제적으로 특정 구문을 실행할 때 모든 스레드의 접근을 차단시킨다는 의미가있습니다.
즉, 이벤트와 강제의 차이죠.
아래는 이전 포스팅 링크입니다. 참고하여 차이점을 학습해주세요.
2023.08.16 - [Java] - [Java/Linux] thread간 변수 공유시 Lock 처리 예제(ReentrantLock)
자바 wait, notify로 서로 다른 스레드의 이벤트 대기 예제
아래는 자바에서 2개의 스레드가 이벤트를 대기하고 이벤트가 발생했음을 알려주는 예제입니다. SharedResourc라는 클래스를 선언하여 wait, notify를 랩핑합니다.
class SharedResource {
boolean flag = false;
synchronized void waitForFlagChange() {
while (!flag) {
try {
wait(); // flag가 변경될 때까지 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Flag has been changed!");
}
synchronized void changeFlag() {
flag = true;
notify(); // 대기 중인 스레드에게 flag가 변경되었음을 알림
System.out.println("Flag has been set to true.");
}
}
public class Example {
public static void main(String[] args) {
SharedResource sharedResource = new SharedResource();
Thread waitingThread = new Thread(() -> {
sharedResource.waitForFlagChange();
});
Thread changingThread = new Thread(() -> {
sharedResource.changeFlag();
});
waitingThread.start();
changingThread.start();
}
}