黑马程序员技术交流社区
标题:
多线程等待和唤醒机制中一个小问题,求解释!!
[打印本页]
作者:
belief丶Only
时间:
2013-12-18 10:37
标题:
多线程等待和唤醒机制中一个小问题,求解释!!
本帖最后由 belief丶Only 于 2013-12-18 10:41 编辑
所有代码如下.问题是:我在赋值name和sex的set方法,只写if不写else就是对的,我写if加else判断为什么结果不是我想要的.
我判断的是boolean类型.就有两可能,加上else为什么输出的就不行了?
具体的问题我写在代码注释里了,如下:
class Resource
{
private String name;
private String sex;
private boolean flag = false;
public synchronized void set(String name,String sex)
{
if(flag)
{
try
{
this.wait();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*在这里加上else后输出结果就变成了一大片 "张三...男" 又输出一大片"李思...女"....
* 去掉之后是我要的正确结果输出一次"张三...男" 再输出一次"李思...女"...
* else有错吗??为什么加了else就不能让线程冻结吗?
* */
else
{
this.name=name;
this.sex=sex;
flag = true;
this.notify();
}
}
public synchronized void out()
{
if(!flag)
{
try
{
this.wait();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
System.out.println(name+"..."+sex);
flag =false;
notify();
}
}
}
//输入
class Input implements Runnable
{
Resource r;
Input(Resource r)
{
this.r = r;
}
public void run()
{
int i = 0;
while(true)
{
if(i==0)
{
r.set("张三","男");
}
else
{
r.set("李思","女");
}
i = (i+1)%2;
}
}
}
//输出
class output implements Runnable
{
Resource r;
output(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.out();
}
}
}
public class WaitAndNotify {
public static void main(String[] str)
{
Resource r = new Resource();
Input t = new Input(r);
output o = new output(r);
Thread t1 = new Thread(t);
Thread t2 = new Thread(o);
t1.start();
t2.start();
}
}
复制代码
作者:
一年之后
时间:
2013-12-18 11:24
当t1拿到cpu执行权的时候,执行while循环,第一次 循环i=0,调用的方法是set(张三,男),然后判断为不满足条件执行else下面的语句, 这时候i=1了,fasle = true while在循环,调用的是set(李思,女) 然后t1在去判断,满足条件了t1线程等待,释放执行权
t2拿到执行权之后判断,有值的话,执行输出,然后flag=false;唤醒t1,然后t2在判断,没有值,t2线程等待,释放执行权,
这时候t1拿到执行权的时候,i=1;他执行完if{}里面语句的时候,不执行else的,没有赋值
当在循环一次的时候,i=2,调用的还是set.(张三,男),你set(李思,女)根本没调用到,
反之是一样的。所以才打印出一大片,一大片的打印。没有交替打印
作者:
belief丶Only
时间:
2013-12-18 11:54
一年之后 发表于 2013-12-18 11:24
当t1拿到cpu执行权的时候,执行while循环,第一次 循环i=0,调用的方法是set(张三,男),然后判断为不满足 ...
对对,明白了!谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2