Topic: 求教:一个多线程执行过程的疑问,关于sleep()方法的相关。

  Print this page

1.求教:一个多线程执行过程的疑问,关于sleep()方法的相关。 Copy to clipboard
Posted by: drxjava
Posted on: 2004-10-26 20:52

{请您活用编辑功能使您的内容更易读,谢谢}
先看看下面的代码:
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="张三";
try{Thread.sleep(1);}catch(Exception e){}
q.sex="男";
}
else
{
q.name="李四";
q.sex="女";
}
i=(i+1)%2;
}
}
}
class Consumer implements Runnable
{
Q q;
public Consumer(Q q)
{
this.q=q;
}
public void run()
{
while(true)
{
System.out.print(q.name);
System.out.println(":"+q.sex);
}
}
}
class Q
{
String name="unknown";
String sex="unknown";
}
class ThreadCommunications
{
public static void main(String [] args)
{
Q q=new Q();
new Thread(new Producer(q)).start();
new Thread(new Consumer(q)).start();
}
}

------------------------------------------------------------
运行结果是:开始是输出:“张三:unknown”几次以后就输出为:“张三:女”,而且一直这样执行下去好多的。

疑问1:为什么线程完成了sleep()以后,张三后面的“男”没有机会执行呢?就直接的到了“女”呢?难道是try{Thread.sleep(1);}catch(Exception e){}后面的
  q.sex="男";
没有得到执行吗?怎么会呢?
疑问2:为什么 它:else
{
  q.name="李四";
  q.sex="女";
}  

象是没有被执行似的呢?但是它应该是能够执行的呀!
请大家帮我找找原因呀!谢谢!:)

2.Re:求教:一个多线程执行过程的疑问,关于sleep()方法的相关。 [Re: drxjava] Copy to clipboard
Posted by: archonLing
Posted on: 2004-10-27 11:17

There is nothing wrong with the code. You are looking at the textbook example of race condition in Threading. You can't gurantee the output since Cosumer & Producer are competing for resource.

Move the try{Thread.sleep(1);}catch(Exception e){} block out of the if..else block. Then, try it. You will be surprised. It is basically the timing issue.

3.Re:求教:一个多线程执行过程的疑问,关于sleep()方法的相关。 [Re: drxjava] Copy to clipboard
Posted by: drxjava
Posted on: 2004-10-27 19:29

I known it ! Thank you very much!
Can you speak Chinese?
I think that you use Chinese more than well.

4.Re:求教:一个多线程执行过程的疑问,关于sleep()方法的相关。 [Re: drxjava] Copy to clipboard
Posted by: xxg0621
Posted on: 2004-11-13 17:29

程序中的所有代码都执行了,关键是从第二次开始每次执行到q.sex="女";再执行q.name="张三",接着producer线程sleep,consumer线程执行,结果就如你所说了

5.Re:求教:一个多线程执行过程的疑问,关于sleep()方法的相关。 [Re: drxjava] Copy to clipboard
Posted by: roc8633284
Posted on: 2004-11-15 20:22

我想: 执行到打印语句时,该线程独占CUP,不停的执行,以至于看不到别的情况。
我只是在打印语句前加一个 Thread.sleep(1000) 语句,让其暂停执行。
可以看到不同的结果。


我的个人之见。

6.Re:求教:一个多线程执行过程的疑问,关于sleep()方法的相关。 [Re: drxjava] Copy to clipboard
Posted by: roc8633284
Posted on: 2004-11-15 20:43

补充:为了进一步验证我所猜想的,我降低了打印语句的优先级,结果打印的结果就如程序所预料的了。

 class Consumer implements Runnable{  
Q q;
public Consumer(Q q) {
this.q=q; }
public void run() {
while(true) {

Thread.currentThread().setPriority(5);

System.out.print(q.name);
System.out.println(":"+q.sex);
}
}

}


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923