您的位置:首页 > 其它

线程同步—生产消费问题

2015-12-07 00:00 351 查看
importjava.util.Random;
importjava.util.concurrent.locks.Condition;
importjava.util.concurrent.locks.Lock;
importjava.util.concurrent.locks.ReentrantLock;

publicclassDemo05_Goods{
privateObject[]goods=newObject[1];//1:声明产品库
privatestaticLocklock=newReentrantLock();
privatestaticConditioncon=lock.newCondition();

//2:开发一个方法用于向goods里面产产品,用一个线程不断的调用这个方法
publicvoidmake(){
lock.lock();
while(goods[0]!=null){

try{
con.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}finally{
lock.unlock();
}
}
inta=newRandom().nextInt(100);//0~99之间的任意值
goods[0]=a;
System.err.println("生产一个产品:"+goods[0]);
//生产完成以后,就去通知购买人可以购买了
con.signal();
}

//3:开发一个方法不断的去购买
publicvoidbuy(){
lock.lock();
//判断如果没有没有产品,就去等
while(goods[0]==null){
try{
con.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
Objectobj=goods[0];
goods[0]=null;
System.err.println("---------------------------购买到一个产品:"+obj);
con.signal();
}

Threadmaker=newThread(){
@Override
publicvoidrun(){
while(true){
make();
try{
Thread.sleep(100*newRandom().nextInt(4));
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
};

Threadbuyer=newThread(){
publicvoidrun(){
while(true){
buy();
try{
Thread.sleep(100*newRandom().nextInt(4));
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
};
};

publicDemo05_Goods(){
maker.start();
buyer.start();
}

publicstaticvoidmain(String[]args){
newDemo05_Goods();
}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: