生产者消费者问题是在操作系统进程控制的经典问题。
用java来描述这个问题比c语言方便很多,java有自己的机制--synchronized,也因此java建立的都是用户级线程,而不是系统级的线程。
下面是关键代码
仓库是用数组表示的
消费者
synchronized(Commdity.com)
{
Commdity.count--;
tmp=Commdity.com[Commdity.count];//这里把数据取出
Commdity.com[Commdity.count]=null;//此处是个人的c语言写法,(c语言必须程序员自己去对内存进行分配释放,所以不要的地方全部变为NULL)
System.out.println("取出"+tmp.getName());
}
生产者部分
我的写法是先生产,后抢占,这样更节省调度。
if(Commdity.count<Commdity.num)
{
if(tmp==null)
{
tmp=new Commdity("存入"+(Commdity.count+1));
}
synchronized(Commdity.com)
{
System.out.println(tmp.getName());
Commdity.com[Commdity.count++]=tmp;
tmp=null;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这是具体代码
https://github.com/xpbob/ProAndCus.git