这段代码是张孝祥那套视频教程里面讲线程通信里面的
class Producer implements Runnable
{
Q q=null;
public Producer(Q q)
{
this.q=q;
}
public void run()
{
int i=0;
while(true)
{
if(i==0)
{
q.name="Asuka";
try{Thread.sleep(10);}catch(Exception e){}
q.sex="male";
}
else
{
q.name="Page";
q.sex="female";
}

i=(i+1)%2;
}

}
}
class Q
{
String name="Page";
String sex="female11111111111";
}
class Consumer implements Runnable
{
Q q=null;
public Consumer(Q q)
{
this.q=q;
}
public void run()
{
while(true)
{ System.out.println(q.name+"---->"+q.sex);

}
}
}
public class ThreadCommunation
{
public static void main(String args[])
{
Q q=new Q();
new Thread(new Producer(q)).start();
new Thread(new Consumer(q)).start(); }
}打印结果一开始是“Asuka---->female11111111111”(1)
然后过了一会儿就一直是“Asuka---->female”(2)
我的理解是一开始出现(1)这种语句是因为在q.name="Asuka"这句代码执行完后,这个线程处于sleep状态,然后就调用了Consumer那个线程中的打印方法,因此那个时候q.sex里面的内容是female11111111111
然后等到里面i不是0的时候,q.sex就跳转到下面q.sex="female"这句就打印出(2)这种结果我的问题是为什么始终没有打印出“page---->male”或者“page--->female”这样的语句,而q.name一直被"Asuka"所“霸占”???

解决方案 »

  1.   

    因为                        {
    q.name="Page";
    q.sex="female";
    }这一段再两个cpu时间片的机率太小了
    所以短时间打印不出来你可以在中间加上try{Thread.sleep(10);}catch(Exception e){}就可以看到了
      

  2.   

    不好意思,什么是“两个cpu时间片的机率太小了”,我按照2楼的做了,的确能够打印出了,但是就是不知道具体的意思是什么
      

  3.   

    cpu的时间分配是按照时间片为单位的这是操作系统的基础自己看看