Java中 synchronize、wait和notify2

有一个生产者消费者实例,修改了一下,觉得还行,javaeye上有类似的代码。

Producer.java
package com.java.lang.thread.produce_consume;

import java.util.Random;

public class Producer extends Thread {
	private Warehouse warehousec;

	public Producer(Warehouse warehouse) {
		this.warehousec = warehouse;
	}

	public void run() {
		Random random = new Random();
		int num = 0;
		for (;;) {
			try {
				Thread.sleep(500); // 生产速度
				num = 1 + random.nextInt(10);
				warehousec.put(num);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}
}



Consumer.java
package com.java.lang.thread.produce_consume;

import java.util.Random;

public class Consumer extends Thread {
	private Warehouse warehouse;

	public Consumer(Warehouse warehouse) {
		this.warehouse = warehouse;

	}

	public void run() {
		Random random = new Random();
		int num = 0;
		for (;;) {
			try {
				Thread.sleep(300); // 销售速度
				num = 1 + random.nextInt(10);
				warehouse.get(num);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}




Warehouse.java
package com.java.lang.thread.produce_consume;

public class Warehouse {
	public int pnum = 0;

	public Warehouse() {
		this.pnum = 0;
	}

	public Warehouse(int num) {
		this.pnum = num;
	}

	public synchronized void put(int value) throws InterruptedException {
		pnum += value;
		System.out.println("生产了" + value + "件产品.当前库存:" + pnum);
		if(pnum >= 20){
			this.notify();
		}
	}
	
	public synchronized void get(int value) throws InterruptedException {
		if (pnum == 0) {
			System.out.println("没有货了,停止销售。");
			this.wait();
		}else{
			if(value > pnum){
				value = pnum;
			}
			pnum -= value;
			System.out.println("销售了"+value+"件产品.当前库存:" + pnum);
		}
		
	}
}



Main.java
package com.java.lang.thread.produce_consume;

/**
 * wait/notify  机制是为了避免轮询带来的性能损失。
 * @author yuahan
 */
public class Main {
	public static void main(String[] args) {
		Warehouse warehouse= new Warehouse(10);  
		
        Producer p=new Producer(warehouse);  
        p.setName("生产");  
        
        Consumer consumer=new Consumer(warehouse);  
        consumer.setName("销售");  
        
        p.start();  
        consumer.start();  
		
	}
}

你可能感兴趣的:(java,thread)