A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区
传智教育官网黑马程序员官网
只需一步,快速开始
孙国军
中级黑马
黑马币:1
帖子:138
精华:0
© 孙国军 中级黑马 / 2012-4-12 20:44 / 1672 人查看 / 3 人回复 / 0 人收藏 转载请遵从CC协议 禁止商业使用本文
查看全部评分
这DISCUS排版有点问题。 /* 当多个线程操作生产,多个线程操作销售时 */ //商品资源库; import java.util.concurrent.locks.*; //locks.*;为什么locks后面还要加上*号啊?? class Resource { private boolean flag=false; //标记是否有商品,如果为false,则无,如果为true,则有; private String name; //商品名称; private int id; //商品编号; public void setFlag(boolean flag) { this.flag=flag; } public boolean getFlag() { return flag; } public void setGoods(String name) { this.name=name; id++; System.out.println(Thread.currentThread().getName()+"生产商品:"+this.name+"....商品编号:"+id); } public void getGoods() { System.out.println(Thread.currentThread().getName()+"销售商品:"+this.name+"........商品编号:"+id); } private Lock lock=new ReentrantLock(); private Condition conditionInputs=lock.newCondition(); private Condition conditionOutputs=lock.newCondition(); public void inputs() { while(getFlag()) { lock.lock(); try { conditionInputs.await(); setGoods("牙刷"); setFlag(true); conditionOutputs.signal(); } catch (InterruptedException ie) { } finally { lock.unlock(); } } } public void outputs() { while(!getFlag()) //使用while,可以保证线程wait()时,被唤醒后,可以重新再判断flag标记,以防止出现连续两次生产或者连续两次销售的现象发生 { lock.lock(); try { conditionOutputs.await(); getGoods(); setFlag(false); conditionInputs.signal(); } catch (InterruptedException ie) { } finally { lock.unlock(); } } } } //生产商品; class Inputs implements Runnable { private Resource res; //声明一个商品对象; Inputs(Resource res) //把商品对象通过构造函数传入到本类对象中; { this.res=res; } public void run() //复写Runnable接口总run()方法; { while(true) { res.inputs(); } } } //销售商品; class Outputs implements Runnable { private Resource res; //声明一个商品对象; Outputs(Resource res) //把商品对象通过构造函数传入到本类对象中; { this.res=res; } public void run() //复写Runnable接口总run()方法; { while(true) { res.outputs(); } } } class InputsOutputsNewDemo { public static void main(String[] args) { Resource res=new Resource(); Inputs inputs=new Inputs(res); Outputs outputs=new Outputs(res); Thread t1=new Thread(inputs); Thread t2=new Thread(inputs); Thread t3=new Thread(outputs); Thread t4=new Thread(outputs); t1.start(); t2.start(); t3.start(); t4.start(); } }
有了黑马骑士勋章,比白马王子还要牛!