设计四个线程对象,两个线程执行减操作,两个线程执行加操作。
privateintdata=10;//初始值
privatebooleanflag=true;
publicsynchronizedvoidadd(){//加法操作
if(this.flag==false){//已经生产过了,不能生产
try{
super.wait();//等待
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
try{
Thread.sleep(200);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("加法操作:"+this.data++);
this.flag=false;//已经生产完成,修改标志位
super.notify();//唤醒等待线程
}
publicsynchronizedvoidsubtract(){//减法操作
if(this.flag==true){//未生产,不能取走
try{
super.wait();//等待
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("减法操作:"+this.data--);
this.flag=true;//已经取走了,可以继续生产
super.notify();//唤醒等待线程
}
//setter、getter略
}
classAdditionimplementsRunnable{//定义生产者
privateMessagemsg=null;
publicAddition(Messagemsg){
this.msg=msg;
}
@Override
publicvoidrun(){
for(intx=0;x<50;x++){//加法执行50次
this.msg.add();//加法操作
}
}
}
classSubtractionimplementsRunnable{//定义消费者
privateMessagemsg=null;
publicSubtraction(Messagemsg){
this.msg=msg;
}
@Override
publicvoidrun(){
for(intx=0;x<50;x++){//减法执行50次
this.msg.subtract();//执行减法
}
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Messagemsg=newMessage();
newThread(newAddition(msg),"加法对象A").start();//启动线程
newThread(newAddition(msg),"家访对象B").start();//启动者线程
newThread(newSubtraction(msg),"减法对象A").start();//取得线程
newThread(newSubtraction(msg),"减法对象B").start();//取得线程
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。