package adawddwd;
import java.util.*;
class WarehouseControl {
public static void main(String args[]) {
MyWarehouse myWarehouse = new MyWarehouse();
Producer p = new Producer(myWarehouse);
Consumer c = new Consumer(myWarehouse);
p.start();
c.start();
}
}
class MyWarehouse {
Vector<Character> vec;
public MyWarehouse() {
vec = new Vector<Character>();
}
synchronized void put(char ch) {
while (vec.size() == 3) {
try {
wait();
} catch (InterruptedException ie) {
}
}
vec.add(new Character(ch));
System.out.print("창고에 제품 " + ch + "가 들어왔습니다.");
System.out.println("재고수량 : " + vec.size());
notifyAll();
}
synchronized char get() {
while (vec.size() == 0) {
try {
wait(); // -> = Thread.sleep(5000); 시간지정x
} catch (InterruptedException ie) {
}
}
Character ch = (Character) vec.remove(0);
System.out.print("창고에 제품 " + ch + "가 나갔습니다.");
System.out.println("재고수량 : " + vec.size());
notifyAll(); // -> p.interrupt(); , 꺠워야할 대상을 알아야함 , 근데 notifyAll은 그럴필요 x ,, notif은 자고있는 쓰레드들중 하나를 랜덤하게 꺠움
그리고 notifyAll() 은 모든 쓰레드를 다 깨운다고 하지만 그 기준이 있다.
객체마다 waiting pool 이 있는데 해당객체의 waiting pool 에 속해있는 쓰레드만 전부다 깨어난다
모든객체대상x
return ch.charValue();
}
}
class Producer extends Thread {
private MyWarehouse myWarehouse;
public Producer(MyWarehouse vec) {
myWarehouse = vec;
}
public void run() {
for (char ch = 'A'; ch <= 'Z'; ch++) {
System.out.println("생산자가 제품 " + ch + "(을)를 생산했습니다.");
myWarehouse.put(ch);
}
}
}
class Consumer extends Thread {
private MyWarehouse myWarehouse;
public Consumer(MyWarehouse vec) {
myWarehouse = vec;
}
public void run() {
char ch;
for (int i = 1; i <= 26; i++) {
ch = myWarehouse.get();
System.out.println("소비자가 제품 " + ch + "(을)를 소비했습니다.");
}
}
}
자바 쓰레드 Thread.yield(); 사용 (0) | 2015.04.02 |
---|---|
자바 쓰레드 join() (0) | 2015.04.02 |
자바 쓰레드 , setnextThread 로 다음 쓰레드 실행해보기 (0) | 2015.04.02 |
jQgrid 명령어들 모음.. 계속 추가중... (3) | 2015.03.31 |
자바 쓰레드 2개를 이용한 1~100 총합 구하기 (0) | 2015.03.31 |