본문 바로가기
언어/JAVA

wait() / notify() 메서드를 활용한 동기화 프로그래밍

by step 1 2021. 5. 29.
반응형
  • 리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리기 위해 Thread가 wait() 상태가 된다.
  • wait() 상태가 된 Thread은 notify()가 호출 될 때 까지 기다린다.
  • 유효한 자원이 생기면 notify()가 호출되고 wait() 하고 있는 Thread 중 무작위로 하나의 Thread를 재식작 하도록 한다.
  • notifyAll()이 호출되는 경우 wait()하고 있는 모든 Thread가 재시작 된다.
  • 이 경우 유효한 리소스만큼의 Thread만이 수행될 수 있고 자원을 갖지 못한 Thread의 경우는 다시 wait() 상태로 만든다.
  • 자바에서는 notifyAll() 메서드의 사용을 권장한다.

도서관에서 책을 빌리는 예제

package ch67;

import java.util.ArrayList;

class FastLibrary {
	
	public ArrayList<String> shelf = new ArrayList();
		
	public FastLibrary() {
		// TODO Auto-generated constructor stub
		shelf.add("태백산맥1");
		shelf.add("태백산맥2");
		shelf.add("태백산맥3");
		shelf.add("태백산맥4");
		shelf.add("태백산맥5");
		shelf.add("태백산맥6");
	}
	
//	책을 빌림
	public synchronized String lendBook() throws InterruptedException {
		
		Thread t = Thread.currentThread();
		
//		책이 없어서 기다림
//		모두 깨웠기 때문에 다시 시도해서 없을 경우 다시 기다림 처리(while)
		while (shelf.size() == 0) {
			System.out.println(t.getName() + " waiting start");
			wait();
			System.out.println(t.getName() + " waiting end");
		}
//		책을 빌림
		if (shelf.size() > 0) {
//			첫번째 배열 값을 하나씩 빌린다
			String book = shelf.remove(0);
			System.out.println(t.getName() + " : " + book + " lend");
			return book;
			
		} else {
			return null;
		}
		
	}
//	책을 반납
	public synchronized void returnBook(String book) {
		
		Thread t = Thread.currentThread();
		
		shelf.add(book);
//		책이 있으면 스레드를 깨움(하나씩)
//		notify();
//		모두 깨움
		notifyAll();
		System.out.println(t.getName() + " : " + book + " return");
	}
}

class Student extends Thread{
	
	public Student(String name) {
		// TODO Auto-generated constructor stub
		super(name);
	}
	
	@Override
	public void run() {
	
		try {
//			책을 빌린다.
			String title = LibraryMain.library.lendBook();
		
			if (title == null || title == "") {
				System.out.println(getName() + "빌리지 못했음");
				return;
			}

			//	5초 후 책을 반납함
			sleep(5000);
			LibraryMain.library.returnBook(title);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

public class LibraryMain {

	public static FastLibrary library = new FastLibrary();
	
	public static void main(String[] args) {
		
		Student std1 = new Student("std1 ");
		Student std2 = new Student("std2 ");
		Student std3 = new Student("std3 ");
		Student std4 = new Student("std4 ");
		Student std5 = new Student("std5 ");
		Student std6 = new Student("std6 ");
		Student std7 = new Student("std7 ");
		Student std8 = new Student("std8 ");
		Student std9 = new Student("std9 ");
		
		std1.start();
		std2.start();
		std3.start();
		std4.start();
		std5.start();
		std6.start();
		std7.start();
		std8.start();
		std9.start();
		
	}
}

반응형

'언어 > JAVA' 카테고리의 다른 글

알고리즘 2  (0) 2021.05.30
알고리즘 1  (0) 2021.05.30
Thread 3 (멀티 스레드 동기화)  (0) 2021.05.29
Thread 2 (여러 메서드)  (0) 2021.05.29
Thread 1  (0) 2021.05.23