반응형
- 리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리기 위해 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 |