"
以下代码中,main函数中,注释部分和非注释部分有什么区别?为何注释部分的运行结果不正确,而非注释部分运行结果正确?
public class A { public static void main(String[] args) { //Thread xc1=new Thread(new Produce(new Warehouse())); //xc1.start(); //Thread xc2=new Thread(new Sell(new Warehouse())); //xc2.start();
Warehouse wh=new Warehouse(); Produce pd=new Produce(wh); Sell sl=new Sell(wh); Thread xc1=new Thread(pd); xc1.start(); Thread xc2=new Thread(sl); xc2.start(); } } class Warehouse { private char space[]=new char[8]; private int sku=0; public synchronized void sellin(char x) { while(sku==space.length) { try { this.wait(); } catch(Exception e){} } this.notify(); space[sku]=x; ++sku; System.out.println("生产线正在生产第"+sku+"个产品,该产品是"+x); } public synchronized void sellout() { while(sku==0) { try { this.wait(); } catch(Exception e){} } this.notify(); char y=space[sku-1]; --sku; System.out.println("正在消费第"+sku+"个产品,该产品是"+y); } } class Produce implements Runnable { private Warehouse xc=null; Produce(Warehouse x) { this.xc=x; } public void run() { char y; for(int i=0;i<26;i++) { y=(char)('A'+i); xc.sellin(y); } } } class Sell implements Runnable { private Warehouse xc=null; Sell(Warehouse x) { this.xc=x; } public void run() { for(int i=0;i<26;i++) { xc.sellout(); } } }
"
"
短回答:注释中的代码里面在两个线程中使用了两个不同的 Warehouse 对象。在非注释代码块中使用的是同一个对象实例。
额外的建议:在你调用 Thread
的 start
方法的时候,你的 Runnable
对象的 run
方法就立即在这个新创建的线程中开跑了,你在调用线程(也可以称为主线程)中接下来的操作会同时执行。
你的代码中同时调用了两个线程实际上执行次序是难以预测的。如果你要它们同时开跑,需要使用 java.util.concurrent.Semaphore
来同步。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。