生產者消費者模式--java多執行緒同步方法的應用

朱同學發表於2019-03-06

生產者消費者模式是對java多執行緒的一個基礎應用
我們一共設計了貨物 生產者 消費者三個類
貨物有商標和名稱兩個屬性和對應的設定訪問方法
生產者用於設定貨物的屬性
消費者用於訪問並列印貨物的屬性
我們設定了一個生產者執行緒和兩個消費者執行緒,其中生產者一次只能生產一批貨物,由兩個消費者爭奪資源,程式碼如下

class Goods {
	private String brand;
	private String name;
	boolean flag;//為真即有商品,為假則沒有
	//空構造器
	public Goods() {
	}
	//非空構造器
	public Goods(String brand, String name) {
		super();
		this.brand = brand;
		this.name = name;
	}
	//屬性設定和獲得方法
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	//synchronized修飾的生產方法
	public synchronized void  set(String brand,String name)  {
		if(flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO 自動生成的 catch 塊
				e.printStackTrace();
			}
		}
		this.brand=brand;
		try {
			Thread.sleep(400);
		} catch (InterruptedException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		this.name=name;
		System.out.println(Thread.currentThread().getName()+"生產者執行緒生產了-----" + getBrand() + getName());
		flag = true;
		notifyAll();
		
	}
	//synchronized修飾的消費方法
	public synchronized void get() {
		
		while(!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO 自動生成的 catch 塊
				e.printStackTrace();
			}
		}
		System.out.println(Thread.currentThread().getName()+"消費了----" + getBrand() + getName());
		flag=false;
		notify();
	}
}
//生產者類,用於生產,即給貨物Goods設定屬性
public class Producter implements Runnable {
	private Goods g;

	public Producter(Goods g) {
		super();
		this.g = g;
	}

	@Override
	public void run() {
		for (int i = 0; i < 30; i++) {
			if (i % 2 == 0) {
				g.set("哇哈哈"," 礦泉水");
			} else {
				g.set("旺仔", "小饅頭");
			}

			}
	}
}
//消費者類,消費貨物,即訪問貨物的屬性
class Customer implements Runnable {
	private Goods g;

	public Customer(Goods g) {
		super();
		this.g = g;
	}
	@Override
	public void run() {
		for (int i = 0; i < 30; i++) {
			g.get();
			Thread.yield();
		}
	}
}
public class 消費者生產者模式 {
	public static void main(String[] args) {
		//商品物件
		Goods g=new Goods();
		//生產者和消費者物件
		Producter p = new Producter(g);
		Customer c1 = new Customer(g);
		//執行緒設定
		
		Thread a = new Thread(c1,"消費者A");
		Thread b = new Thread(c1,"消費者B");
		Thread c = new Thread(p);
		a.start();
		b.start();
		c.start();
		
	}
}

相關文章