站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题线程间通信的问题

线程间通信的问题

摘要: 线程间通信的问题


这段代码是张孝祥那套视频教程里面讲线程通信里面的
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=-#34;Asuka-#34;;
try{Thread.sleep(10);}catch(Exception e){}
q.sex=-#34;male-#34;;
}
else
{
q.name=-#34;Page-#34;;
q.sex=-#34;female-#34;;
}

i=(i+1)%2;
}

}
}
class Q
{
String name=-#34;Page-#34;;
String sex=-#34;female11111111111-#34;;
}
class Consumer implements Runnable
{
Q q=null;
public Consumer(Q q)
{
this.q=q;
}
public void run()
{
while(true)
{

System.out.println(q.name+-#34;-----#62;-#34;+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-----#62;female11111111111”(1)
然后过了一会儿就一直是“Asuka-----#62;female”(2)
我的理解是一开始出现(1)这种语句是因为在q.name=-#34;Asuka-#34;这句代码执行完后,这个线程处于sleep状态,然后就调用了Consumer那个线程中的打印方法,因此那个时候q.sex里面的内容是female11111111111
然后等到里面i不是0的时候,q.sex就跳转到下面q.sex=-#34;female-#34;这句就打印出(2)这种结果

我的问题是为什么始终没有打印出“page-----#62;male”或者“page----#62;female”这样的语句,而q.name一直被-#34;Asuka-#34;所“霸占”???


因为 {
q.name=-#34;Page-#34;;
q.sex=-#34;female-#34;;
}

这一段再两个cpu时间片的机率太小了
所以短时间打印不出来

你可以在中间加上try{Thread.sleep(10);}catch(Exception e){}

就可以看到了






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


cpu的时间分配是按照时间片为单位的

这是操作系统的基础

自己看看




好的,谢谢了


↑返回目录
前一篇: 关于线程循环问题
后一篇: 一个关于时间加减的问题.