java编程初级问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 00:17:12
class Producer implements Runnable
{
Q q;
public Producer(Q q)
{
this.q =q;
}
public void run()
{
int i=0;
while(true)
{
if (i==0)
{
q.name= "zhang";
try{Thread.sleep(1);}catch(Exception e){}
q.sex= "male";
}
else
{
q.name="li";
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)
{
System.out.println(q.name);
System.out.println(q.sex);
}
}
}

class Q
{
String name="unknown";
String sex=&q

返回zhang female的时候是第一个循环已经执行过一次了,当时是第二次或者更多的偶数次。因为sleep(1)时间太短,所以第二个线程没有在进行第一个线程的第一个循环读取,因为启动线程的时间要大于1毫秒。

当睡眠时间改变成1000毫秒的时候,第二个线程在第一个线程的第一个循环执行到一半的时候就去读取了,所以能得到尚未改变的unknow的值。

线程之间的非同步方法行为是无法预测的。因为你不知道一个线程和另外一个线程的执行进度相差多少。除非你可以让每个线程睡眠更长的时间来模拟CPU的线程切换,但是这样程序就会变得非常缓慢。

sleep()中间以毫秒算的,1000也才一秒啊,我也搞不满清