开发者社区> 问答> 正文

Java中关于线程的一个问题。报错

"

以下代码中,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(); } } }

"

展开
收起
因为相信,所以看见。 2020-05-27 12:59:16 573 0
1 条回答
写回答
取消 提交回答
  • 阿里,我所有的向往

    "

    短回答:注释中的代码里面在两个线程中使用了两个不同的 Warehouse 对象。在非注释代码块中使用的是同一个对象实例。

    额外的建议:在你调用 Threadstart 方法的时候,你的 Runnable 对象的 run 方法就立即在这个新创建的线程中开跑了,你在调用线程(也可以称为主线程)中接下来的操作会同时执行。

    你的代码中同时调用了两个线程实际上执行次序是难以预测的。如果你要它们同时开跑,需要使用 java.util.concurrent.Semaphore 来同步。

    "
    2020-05-27 16:23:55
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载