在说到进程的同步的问题上,毫无疑问,生产者与消费者这个经典问题是不可避免的。
生产者生产的前提是:生产者生产出来的产品容器还能够装下,否则等待消费者消费;
消费者消费的前提是:容器中有产品能够让消费者消费,否则等待生产者生产;
public class Test { public static void main(String[] args){ Store s=new Store(); Productor p1=new Productor(s); Customers c1=new Customers (s); Thread s1=new Thread(p1,"生产者1"); Thread s2=new Thread(p1,"生产者2"); Thread s3=new Thread(p1,"生产者3"); Thread s4=new Thread(p1,"生产者4"); Thread s5=new Thread(c1,"消费者1"); Thread s6=new Thread(c1,"消费者2"); Thread s7=new Thread(c1,"消费者3"); s1.start(); s2.start(); s3.start(); s4.start(); s5.start(); s6.start(); s7.start(); } }生产者类:
public class Productor implements Runnable { Store s; public Productor(Store s){ this.s=s; } @Override public void run() { while(true) s.SetGoods(); } }消费者类:
public class Customers implements Runnable{ Store s; public Customers(Store s){ this.s=s; } @Override public void run() { while(true) s.GetGoods(); } }存储的仓库类:
public class Store { //容器中可以存放的最大的产品的数目 int max=50; //容器中某一时刻的产品数 int nowGood=0; public synchronized void SetGoods(){ if(nowGood<max){ try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } nowGood= nowGood+1; System.out.println(Thread.currentThread().getName()+"生产了第"+nowGood+"个产品"); } } public synchronized void GetGoods(){ if(nowGood>0){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"消费了第"+nowGood+"个产品"); nowGood= nowGood-1; } } }
这里应该注意就是加锁的时候一定要在while循环的里面。