wait, notify, notify All, 간단한 그룹 아날로그 대기열은 독자 쓰기 문제를 실현합니다.

4345 단어
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();
	}
	
}

좋은 웹페이지 즐겨찾기