wait, notify, notify All, 간단한 그룹 아날로그 대기열은 독자 쓰기 문제를 실현합니다.
notify는 대기 대기열의 한 라인만 깨우고, notifyAll은 모든 대기 라인을 깨우며, 깨우는 모든 라인은 임계 구역에 대한 상호 배척 접근을 확보하기 위해 다시 잠금 경쟁에 들어갈 수 있습니다.
notify, notify All, wait 방법은 Thread 클래스가 아닌 Object 클래스에 정의됩니다.이렇게 하면 notify 방법은 이 자물쇠 대상을 기다리는 라인 중 하나이고,wait는 현재 이 대상의 자물쇠를 가지고 있는 대상을 wait에 들어가게 하고,notify All 방법은 이 자물쇠 대상을 기다리는 모든 라인을 깨운다.
상기 세 가지 방법을 사용하려면 반드시 상응하는 대상 자물쇠를 소지해야 한다.그렇지 않으면 Illegal Monitor State Exception 이상을 던집니다.
다음은 생산자, 소비자를 간단하게 실현한 예이다.이 예는 블락큐어 등 생산자, 소비자 모델을 실현하기 쉬운 유형을 사용하지 않았다.단지 notify All과 wait의 본질을 더욱 뚜렷하게 나타내기 위해서다.
public class Product{
private int productId = 0;
private String productName = "";
public int getProductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
}
public class Queue {
private Product productArr[] = new Product[10];
private volatile int queueIndex = -1;
private volatile boolean isEmpty = true;
private volatile boolean isFull = false;
public void push() {
synchronized (productArr) {// productArr
while (isFull) {
try {
productArr.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Product product = new Product();
queueIndex++;
product.setProductId(queueIndex);
int t1 = (int) (Math.random() * 10);
int t2 = (int) (Math.random() * 10);
int t3 = (int) (Math.random() * 10);
int t4 = (int) (Math.random() * 10);
product.setProductName(String.valueOf(System.currentTimeMillis())
+ t1 + "" + t2 + "" + t3 + "" + t4);
System.out.println(" ==================================");
System.out.println(" thread: " + Thread.currentThread().getName());
System.out.println(" id: " + product.getProductId());
System.out.println(" name: " + product.getProductName());
System.out.println(" ==================================");
System.out.println();
isEmpty = false;
this.productArr[queueIndex] = product;
if (queueIndex == 9) {
isFull = true;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
productArr.notifyAll();
// productArr.notifyAll();
}
}
public void pop() {
synchronized (productArr) {// productArr
while (isEmpty) {// ,
try {
productArr.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Product product = productArr[queueIndex];
productArr[queueIndex] = null;
if (queueIndex >= 0) {
queueIndex--;
}
if (queueIndex == -1) {
isEmpty = true;
}
isFull = false;
System.out.println(" ----------------------------------");
System.out.println(" thread: " + Thread.currentThread().getName());
System.out.println(" id: " + product.getProductId());
System.out.println(" name: " + product.getProductName());
System.out.println(" ----------------------------------");
System.out.println();
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
productArr.notifyAll();
}
}
}
public class MainThread implements Runnable{
private int threadType = 0;//0 ,1
private Queue queue = null;
public MainThread(int threadType, Queue queue){
this.threadType = threadType;
this.queue = queue;
}
@Override
public void run() {
if( threadType == 0 ){
while(true){
queue.pop();
}
}else{
while(true){
queue.push();
}
}
}
public static void main(String args[]){
Queue queue = new Queue();
MainThread consumer1 = new MainThread(0, queue);
MainThread consumer2 = new MainThread(0, queue);
MainThread consumer3 = new MainThread(0, queue);
MainThread producter = new MainThread(1, queue);
Thread con1 = new Thread(consumer1, " 1");
Thread con2 = new Thread(consumer2, " 2");
Thread con3 = new Thread(consumer3, " 3");
Thread pro1 = new Thread(producter, " 1");
con1.start();
con2.start();
con3.start();
pro1.start();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.