黑马程序员技术交流社区
标题:
请大家帮忙看看 为什么循环进行不下去
[打印本页]
作者:
游兴钟
时间:
2012-4-16 21:59
标题:
请大家帮忙看看 为什么循环进行不下去
class Res
{
String name;
String sex;
boolean flag = false;
}
class Input implements Runnable
{
private Res r ;
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
synchronized(r)
{
if(r.flag==false)
continue;
//try{r.wait();}catch(Exception e){}
if(x==0)
{
r.name="mike";
r.sex="man";
}
else
{
r.name="丽丽";
r.sex = "女女女女女";
}
x = (x+1)%2;
r.flag = true;
//r.notify();
}
}
}
}
class Output implements Runnable
{
private Res r ;
Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized(r)
{
if(r.flag==false)
continue;//try{r.wait();}catch(Exception e){}
System.out.println(r.name+"...."+r.sex);
r.flag = false;
//r.notify();
}
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
Res r = new Res();
Input in = new Input(r);
Output out = new Output(r);
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
作者:
蒋亮
时间:
2012-4-16 22:40
你不能用对象锁起来调用wait和notify方法啊,你改为this.wait和this.notify不就行了吗?加上括号啊,我键盘坏了,括号打不出来。
作者:
彭盼
时间:
2012-4-16 23:56
本帖最后由 彭盼 于 2012-4-17 00:01 编辑
非静态函数所用的锁是this,静态同步函数用的锁是此方法所在class的字节码文件,这是老师专门讲过的,是你的锁搞错了
作者:
孙国军
时间:
2012-4-17 01:11
class Res
{
String name;
String sex;
boolean flag = false;
}
class Input implements Runnable
{
private Res r ;
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
synchronized(r)
{
if(r.flag)
//r.flag==false 因为flag默认值为false,当t1线程执行到这,r.flag==false为true,t1进入冻结状态,flag标记没有改变;
//continue;
try{r.wait();}catch(Exception e){}
if(x==0)
{
r.name="mike";
r.sex="man";
}
else
{
r.name="丽丽";
r.sex = "女女女女女";
}
x = (x+1)%2;
r.flag = true;
r.notify();
}
}
}
}
class Output implements Runnable
{
private Res r ;
Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized(r)
{
if(!r.flag)
//r.flag==false 当t2线程运行时,r.flag==false还是为true,t2进入冻结状态,自此,t1和t2线程都进入冻结状态,
try{r.wait();}catch(Exception e){}; //continue
System.out.println(r.name+"...."+r.sex);
r.flag = false;
r.notify();
}
}
}
}
class j
{
public static void main(String[] args)
{
Res r = new Res();
Input in = new Input(r);
Output out = new Output(r);
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
上方红色字体部分,经过改动
作者:
袁培育
时间:
2012-4-17 08:40
正如楼上所说,你把 两个if(r.flag==false)都改为 if(r.flag)应该就可以开始循环了,但是也只能执行一次,因为循环一次后,flag变为true,到if时就直接continue,进行下一次循环,而flag的值没有被改变,除非出现这种情况,你的t1先执行一次循环还没到改变flag值时,t2开始执行循环,在t2将要执行 r.flag = false;语句时t1先执行了一次这个语句,flag变为true紧接着t2执行一次,将flag右边为false,否则你的循环就会成为一个死循环,其实你的循环已经开始执行了,不信你可以在while和 synchronized之间加一个输出语句就会发现循环一直在执行,只是到if(r.flag)时由于flag为true所以就continue了,就直接下次循环了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2