상세 컨텐츠

본문 제목

자바 쓰레드 , wait() , sleep(mil) , interrupt() , notifyAll()에 대해

관리X 과거글

by 까먹기전에 2015. 4. 2. 10:35

본문

반응형

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 + "(을)를 소비했습니다.");

}

}

}

관련글 더보기