这段代码是张孝祥那套视频教程里面讲线程通信里面的
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"所“霸占”???
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"所“霸占”???
q.name="Page";
q.sex="female";
}这一段再两个cpu时间片的机率太小了
所以短时间打印不出来你可以在中间加上try{Thread.sleep(10);}catch(Exception e){}就可以看到了