线程同步—生产消费问题
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();
}
}
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();
}
}
相关文章推荐
- 学习 AngularJS (二)
- log4j自定义标签等级输出到指定文件
- OC20简易计算器
- mysql 中文按照拼音排序
- Hive导入10G数据的测试
- linux sysctl.conf中相关重要设定的详细说明
- 也算是终于把局域网多人聊天室写好了
- 程序员在遇到bug时的30中反应
- java学习(一)
- Java学习(二)
- Java学习(三)
- Java学习(四)
- tomcat结合nginx使用小结
- iOS"Request failed: unacceptable content-type: tex
- AFNetworking 2.0 使用总结
- iOS开发技巧 autolayout自动布局
- OCTAVE
- 突破 YouTube 观影年龄的限制
- 取模
- 抢票神器