고전적인 생산자-소비자 문제의 시뮬레이션. 이 프로그램은 가장 간단한 경우인 단일 버퍼링을 시뮬레이션합니다. 실제 상황을 시뮬레이션하기 위해 아이템 소비 및 아이템 생산 시 딜레이가 추가됩니다. 딜레이를 수정하여 다양한 생성률과 소비율을 시뮬레이션할 수 있습니다.
[암호]
[/co/**
* 단일 버퍼 소비자-생산자 문제.
* 작성자: xu([email protected]).
* */
공개 클래스 ConsumerProducer {
정적 개체 버퍼 = null;
정적 객체 뮤텍스 = new Object();
정적 객체 condConsumer = new Object();
정적 객체 condProducer = new Object();
공개 정적 무효 메인(String[] args) {
스레드 생산자 = 새 Thread() {
공개 무효 실행() {
//for(int i=0; i<10; i++) {
for(int i=0; ; i++) {
//아이템을 생산합니다.
노력하다 {
Thread.sleep(1000);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
문자열 항목 = new String("항목-" + i);
System.out.println("[생산자]가 생산함 " + 항목);
// 버퍼가 비워질 때까지 기다립니다.
동기화됨(condProducer) {
while(버퍼 != null) {
노력하다 {
condProducer.wait();
} 잡기(InterruptedException e) {
e.printStackTrace();
}
}
}
// 항목을 버퍼에 넣습니다.
동기화됨(뮤텍스) {
버퍼 = 아이템;
System.out.println("[생산자]는 " + 항목 + "를 버퍼에 넣습니다.");
}
// 소비자에게 알립니다.
동기화됨(condConsumer) {
condConsumer.notify();
}
}
}
};
스레드 소비자 = 새 Thread() {
공개 무효 실행() {
//for(int i=0; i<10; i++) {
을 위한( ; ; ) {
// 아이템이 올 때까지 기다립니다.
동기화됨(condConsumer) {
while(버퍼 == null ) {
노력하다 {
condConsumer.wait();
} 잡기(InterruptedException e) {
e.printStackTrace();
}
}
}
// 버퍼에서 항목을 가져옵니다.
문자열 항목 = null;
동기화됨(뮤텍스) {
item = (문자열)버퍼;
버퍼 = 널;
System.out.println(" [소비자]는 버퍼에서 " + 항목 + "를 가져옵니다.");
}
//아이템을 소비합니다.
노력하다 {
Thread.sleep(500);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
System.out.println(" [소비자]가 소비했습니다. " + 항목);
// 생산자에게 알립니다.
동기화됨(condProducer) {
condProducer.notify();
}
}
}
};
소비자.시작();
생산자.시작();
}
}드]