「已注销」 2011-01-03 16:05
浏览 185
已采纳

一段关于线程的代码 请教

代码如下:
目的是要打出“张三”“男”,“李四”“女”。但是我只能打印出“张三”的信息,却无法打印出“李四”的信息,请问这是怎么回事?谢谢

class Producer implements Runnable
{
Q q;
public Producer(Q q)
{
this.q = q;
}
public void run()
{
int i=0;
while(true)
{
synchronized(q)
{
if(i==0)
{
q.name="zhangsan";
try{Thread.sleep(1);}catch(Exception e){}
q.sex="male";
System.out.println(i);
}
else
{
q.name="lisi";
q.sex="female";
}

}
i=(i+1)%2;
}

}

}

class Consumer implements Runnable
{
Q q;
public Consumer(Q q)
{
this.q = q;
}
public void run()
{
while(true)
{
synchronized(q)
{
System.out.print(q.name);
System.out.println(":" + q.sex);
}
}
}
}

class Q
{
String name="unknown";
String sex="unknown";
}

class ThreadCommunication
{
public static void main(String[] args)
{
Q q = new Q();
new Thread(new Producer(q)).start();
new Thread(new Consumer(q)).start();
}
}

  • 写回答

4条回答 默认 最新

  • beneo 2011-01-03 16:52
    关注

    对不起,你真的应该用[code]来框下,我没有看到你的[b]}[/b]

    synchronized(q),2个线程很公平的获得q这个对象的monitor,也就是获得锁
    [code="java"]
    while(true)
    {
    synchronized(q)
    {
    System.out.print(q.name);
    System.out.println(":" + q.sex);
    }
    }
    [/code]

    另外一个是
    [code="java"]
    while(true)
    {
    synchronized(q)
    {
    if(i==0)
    {
    q.name="zhangsan";
    try{Thread.sleep(1);}catch(Exception e){}
    q.sex="male";
    System.out.println(i);
    }
    else
    {
    q.name="lisi";
    q.sex="female";
    }

    }
    i=(i+1)%2;
    }
    [/code]

    所以有可能,Producer一直在生产,而Consumer因为没有获得q对象的monitor,从而没有打印出
    [code="java"]
    System.out.print(q.name);
    System.out.println(":" + q.sex);
    [/code]

    你在
    i=(i+1)%2; 下面加一个 q.wait(); 表示拥有q对象monitor的当前线程等待


    System.out.print(q.name);
    System.out.println(":" + q.sex);
    下面 q.notify(); 表示唤醒一个q对象等待的线程

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码