Java 프로그램인데 자꾸 에러가 납니다.
2010.08.08 01:56
소설같은 자바에 나오는 프로그램을 타이핑해서 돌려보는데, 계속 에러가 나옵니다. 이유는 어느 정도 짐작이 가는데, 어떻게 수정을 해야 할지 모르겠습니다. 고수분들의 가르침 부탁 드립니다.
/***
스레드의 우선권을 테스트하는 예제
***/
class PriorityThread extends Thread {
public void run() {
int i = 0;
System.out.println(this.getName());
System.out.println("[우선권:" + this.getPriority() + "] 시작\t");
while(i < 10000) {
i = i + 1;
try {
this.sleep(1);
} catch(Exception e) {
System.out.println(e);
}
}
System.out.print(this.getName());
System.out.println("[우선권:" + this.getPriority() + "] 종료\t");
}
}
public class PriorityThreadMain {
public static void main(String[] args) {
System.out.println("Main 메서드 시작");
for(int i = 1; i <= 10; i++) {
PriorityThread s = new PriorityThread();
s.setPriority(i);
s.start();
}
System.out.println("Main 메서드 종료");
}
}
for문에서 thread가 생성되면 blocking되지 않고 바로 넘어가게 되는데, for문이 끝나고 바로 프로그램이 종료되기 때문에 문제가 되겠네요. thread는 돌아가는데 process는 종료되는 상황이니깐요.
보통 저런 경우에는 동기화객체를 만들어주는데, 가장 간단한 방법은 변수하나를 공유하는 방법입니다. thread.run()이 끝날때마다 그 변수값에 +1을 해주고, for문이 종료된 후에는 그 변수값이 thread 갯수랑 같아질때까지 wait()를 하는거죠.
while(terminated_thread_count < 10) sleep(1);
제대로 된 동기화객체들을 쓰면 좀더 CPU 점유율도 적고 더 다양한 용도로 쓸수 있겠지만, 기초적인 원리는 저렇습니다.