/*資源類*/
public class ShareValue {private int total;public ShareValue(int total){this.total=total;}//生產void putValue(int value){total+=value;}//消費資源int getValue(int value){if(total-value>=0){total-=value;}else{value=total;total=0;System.out.println("Empty!");}return value;}//得到當前的資源值int getNowTotal(){return total;}}/* 生產者類 */
class Producer extends Thread {// 共享的ShareValue對象ShareValue share;// 要增加的值int value;public Producer(String name, ShareValue share, int value) {super(name);this.share = share;this.value = value;}public void run() {//同步share對象 ,直到當前代碼塊運行完畢后,share的對象鎖才會釋放synchronized (share) {// 在增加之前獲取share的total值int n = share.getNowTotal();try {sleep(100);} catch (InterruptedException e) {System.out.println(e);}share.putValue(value);// 打印增加之前的total的值n,增加的值value和增加之后total的值System.out.println(getName() + ",Value:" + n + " Put value:"+ value + " Total value:" + share.getNowTotal());}}
}/*消費者類*/
class Consumer extends Thread{//共享的ShareValue對象ShareValue share;//要減少的值int value;public Consumer(String name,ShareValue share, int value) {super(name);this.share = share;this.value = value;}public void run(){ //同步share對象,直到當前代碼運行完畢后,share的對象鎖才會釋放synchronized (share) {//在減少之前,獲取share對象的total值int n=share.getNowTotal();try {sleep(100);} catch (InterruptedException e) {System.out.println(e);}share.getValue(value);//打印減少之前的total的值n,減去的值value和減少之后total的值System.out.println(getName()+",Value:"+n+" Get value:"+value+" Total value:"+share.getNowTotal());}}
}/* 測試主類 */
public class TestDemo {public static void main(String[] args) {ShareValue share=new ShareValue(0);Producer producer1=new Producer("producer1", share, 100);Producer producer2=new Producer("producer2",share,200);Consumer consumer=new Consumer("consumer", share, 50);producer1.start();producer2.start();consumer.start();}}
/* 通過對share對象的鎖定來達到同步的目的 */