「已注销」 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 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题