다음과 같이 코드 코드를 복사합니다.
패키지 상태;
import java.util.ArrayList;
java.util.List 가져오기;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 잠금 및 조건을 사용하여 생산자-소비자 모델 구현
* @author는
*
*/
공개 클래스 ProducerConsumerDemo {
공개 정적 무효 메인(String[] args) {
int producerCount = 10;
int 소비자수 = 15;
final ProducerConsumerDemo pcd = new ProducerConsumerDemo(5) // 버퍼 크기는 5입니다.
Thread[] producerThreads = 새로운 Thread[producerCount];
for(int i = 0; i < producerCount; i++) {
producerThreads[i] = new Thread("생산자" + (i+1)) {
@보수
공개 무효 실행() {
pcd.Produce();
}
};
}
Thread[] 소비자Threads = 새로운 Thread[consumerCount];
for(int j = 0; j < ConsumerCount; j++) {
ConsumerThreads[j] = new Thread("소비자" + (j+1)) {
@보수
공개 무효 실행() {
pcd.consume();
}
};
}
//생산자 소비자 스레드 시작
for(int i = 0; i < producerCount; i++) {
producerThreads[i].start();
}
for(int j = 0; j < ConsumerCount; j++) {
소비자Threads[j].start();
}
}
개인 정적 최종 int DEFAULT_BUFFER_SIZE = 10;
private int bufferSize; // 버퍼 크기
개인 목록<객체> bufferList;
개인 최종 잠금 잠금 = new ReentrantLock(true);
개인 최종 조건 조건 = lock.newCondition();
공개 ProducerConsumerDemo(int bufferSize) {
this.bufferSize = bufferSize > 0 ? 버퍼 크기: DEFAULT_BUFFER_SIZE;
bufferList = new ArrayList<Object>(bufferSize);
}
// 생산
공공 무효 생산() {
lock.lock(); //잠금
노력하다 {
while(bufferList.size() == bufferSize) { // 버퍼가 가득 찼습니다.
System.out.println("생산자 대기, 스레드: " + Thread.currentThread().getName());
조건.대기();
}
// 생산
bufferList.add(new Object());
System.out.println("생산자가 하나를 생성하고 이제 버퍼 크기: "
+ bufferList.size() + " 및 스레드: " + Thread.currentThread().getName());
Condition.signalAll(); // 소비자에게 알립니다.
} catch(InterruptedException e) {
e.printStackTrace();
} 마지막으로 {
lock.unlock();
}
}
// 소비
공공 무효 소비() {
lock.lock(); //잠금
노력하다 {
while(bufferList.isEmpty()) { // 버퍼가 비어 있습니다.
System.out.println("소비자 대기, 스레드: " + Thread.currentThread().getName());
조건.대기();
}
// 소비
bufferList.remove(0); // 연결리스트의 선두에서 하나를 제거합니다.
System.out.println("소비자 소비자 1, 현재 버퍼 크기: "
+ bufferList.size() + " 및 스레드: " + Thread.currentThread().getName());
조건.signalAll();
} catch(InterruptedException e) {
e.printStackTrace();
} 마지막으로 {
lock.unlock();
}
}
}