最近在看毕向东的视频多线程的示例程序,发现自己这个程序总是打不对。
一个线程负责存入姓名与性别,另一个线程负责打印。要求是存入一个,打印一个。
class Res
{
String name;
String gender;
boolean pos = false;
}
class Input implements Runnable //存入性别,性别
{
private Res r;
Input(Res r)
{
this.r=r;
}
public void run() //重写run方法,存入
{
int flag=0;
for(int i=0;i<100;i++ )
{
synchronized(r)
{
if(r.pos)
{
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(flag==0)
{
r.name="Jack";
r.gender="male";
}
else if(flag==1)
{
r.name="lily";
r.gender="female";
}
flag=(flag+1)%2;
r.pos=true;
r.notify();
}
}
}
}
class Output implements Runnable //打印姓名,性别
{
private Res r;
Output(Res r)
{
this.r=r;
}
public void run() //打印出姓名,性别
{
synchronized(r)
{
for(int i =0;i<100;i++)
{
if(r.pos==true)
{
System.out.println(r.name+".."+r.gender+".."+i);
r.pos=false;
r.notify();
}
else //如果把这行改为 if(r.pos==false)结果正确
{
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public class TTT
{
public static void main(String[]args)
{
Res s = new Res();
Input i = new Input(s);
Output o =new Output(s);
Thread t1 =new Thread(i);
Thread t2 =new Thread(o);
t1.start();
t2.start();
}
}
打印结果为:
Jack..male..0
lily..female..2
Jack..male..4
lily..female..6
Jack..male..8
lily..female..10
Jack..male..12
lily..female..14
Jack..male..16
lily..female..18
Jack..male..20
lily..female..22
Jack..male..24
lily..female..26
Jack..male..28
lily..female..30
Jack..male..32
lily..female..34
Jack..male..36
lily..female..38
Jack..male..40
lily..female..42
Jack..male..44
lily..female..46
Jack..male..48
lily..female..50
Jack..male..52
lily..female..54
Jack..male..56
lily..female..58
Jack..male..60
lily..female..62
Jack..male..64
lily..female..66
Jack..male..68
lily..female..70
Jack..male..72
lily..female..74
Jack..male..76
lily..female..78
Jack..male..80
lily..female..82
Jack..male..84
lily..female..86
Jack..male..88
lily..female..90
Jack..male..92
lily..female..94
Jack..male..96
lily..female..98
而我想要的结果如下:
Jack..male..0
lily..female..1
Jack..male..2
lily..female..3
Jack..male..4
lily..female..5
Jack..male..6
lily..female..7
Jack..male..8
lily..female..9
Jack..male..10
lily..female..11
Jack..male..12
lily..female..13
Jack..male..14
lily..female..15
Jack..male..16
lily..female..17
Jack..male..18
lily..female..19
Jack..male..20
lily..female..21
Jack..male..22
lily..female..23
Jack..male..24
lily..female..25
Jack..male..26
lily..female..27
Jack..male..28
lily..female..29
Jack..male..30
lily..female..31
Jack..male..32
lily..female..33
Jack..male..34
lily..female..35
Jack..male..36
lily..female..37
Jack..male..38
lily..female..39
Jack..male..40
lily..female..41
Jack..male..42
lily..female..43
Jack..male..44
lily..female..45
Jack..male..46
lily..female..47
Jack..male..48
lily..female..49
Jack..male..50
lily..female..51
Jack..male..52
lily..female..53
Jack..male..54
lily..female..55
Jack..male..56
lily..female..57
Jack..male..58
lily..female..59
Jack..male..60
lily..female..61
Jack..male..62
lily..female..63
Jack..male..64
lily..female..65
Jack..male..66
lily..female..67
Jack..male..68
lily..female..69
Jack..male..70
lily..female..71
Jack..male..72
lily..female..73
Jack..male..74
lily..female..75
Jack..male..76
lily..female..77
Jack..male..78
lily..female..79
Jack..male..80
lily..female..81
Jack..male..82
lily..female..83
Jack..male..84
lily..female..85
Jack..male..86
lily..female..87
Jack..male..88
lily..female..89
Jack..male..90
lily..female..91
Jack..male..92
lily..female..93
Jack..male..94
lily..female..95
Jack..male..96
lily..female..97
Jack..male..98
lily..female..99
如我所述:只要把else改为if(r.pos==false)即可,但这两者不是一样的吗?难道是我忽略了什么吗?