본문 바로가기
Java/기본 개념 및 클래스

[Java] 76. Thread 메서드: wait/notify

글: Song hyun 2024. 5. 13.
728x90
반응형

[Java] 76. Thread 메서드: wait/notify

1. Thread 동기화의 이해

2. wait / notify 메서드의 이해

3. 프로듀서-컨슈머 패턴


 

1. Thread 동기화의 이해

(1) Thread: 하나의 작업의 단위 / 하나의 실행의 단위

(2) Process: 여러개의 Thread를 가진다.

(3) Multi Threading Programming: 하나의 쓰레드가 공유 자원에 접근 할 때,

 

*각각의 Thread는 자신만의 Stack 영역을 가진다.

Thread들은 Heap 영역에 접근할 수 있는데, 이로 인해 의도하지 않은 오류가 발생할 수 있다. (Race Conditional)

 

**이를 방지하기 위해 동기화(Synchronized)를 사용한다.

 

***이 때, Thread들의 접근이 겹치는 부분을 임계 영역이라고 부른다.

 

2. wait / notify 메서드의 이해

(1) wait() 메서드

(2) notify() 메서드

 

3. 프로듀서-컨슈머 패턴

package useful.ch06;

import java.util.ArrayList;

public class WaitNotifyExample {

	// 객체들간에 공유하는 데이터(자원)을 설계
	// static 이기 때문에 인스턴스들이 자원을 공유할 수 있다.
	private static ArrayList<Integer> sharedResource = new ArrayList<>();
	private static boolean isDataAvailable = false;

	// 생산자 만들어 보기
	static class Producer extends Thread {

		@Override
		public void run() {

			synchronized (sharedResource) {
				System.out.println("생산자는 data 생성 시작 ~ ");
				for (int i = 0; i < 10; i++) {
					sharedResource.add(i + 1);

					// 시각적 인지를 위해서 임의 코드 추가
					System.out.print(".");
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				// 작업이 다 끝나면 상태 변경 처리 
				isDataAvailable = true;
				// sharedResource 쓸수 있도록 다른 작업자들에게 알려 주기 notify 
				sharedResource.notify();
				
			} // 동기화 블록 
		}
	}

	// 소비자 만들어 보기
	static class Consumer extends Thread {

	}

	// 테스트 코드
	public static void main(String[] args) {

	} // end of main

}

 

728x90
반응형