本帖最后由 xuemeng 于 2013-5-15 21:08 编辑
public class Demo {
public static void main(String[] args) {
Resource1 r1 = new Resource1();
new Thread(new Input1(r1)).start();
new Thread(new Output1(r1)).start();
}
}
class Resource1 {
private String name;
private String sex;
boolean flag = false;
public synchronized void set(String name, String sex) {
//6, 这是flag的值是true了, 那么线程等待了
if (flag) {
try {
//10, Input线程本来是等到这里的, 现在被唤醒了, 本来线程应该继续往下执行的, 如果真往下执行的话, 那么name, sex 的值别是 gggg, asdf, 可是, 因为你这里是一个if...else语句, 那么这就意味着, 你执行if 语句了, else 语句就不会执行, 那么程序又回到第4步, 回到第4 步后 ,执行完第4步后, i的值又变为0了, 那么这时程序执行第2步, 那么这时的值依然是 123, 456, 打印就不会交叉了
this.wait();
} catch (Exception e) {
System.out.println(e.toString());
}
//3, 程序走到这里来了,执行这里代码, 因为flag为false, 所以执行else语句, name , sex 分别被赋值123, 456, 方法执行完成,程序继续执行, flag = true
} else {// 这里的else 不能要
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
}
public synchronized void get() {
//9, 线程等待,接下来第10步就是关键地方了, 程序出错就在这里
if (!flag) {
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
} else {
//8, 打印 name = 123, sex = 456;
System.out.println(this.name + "....." + this.sex);
flag = false;
this.notify();
}
}
}
class Input1 implements Runnable {
Resource1 res;
Input1(Resource1 res) {
this.res = res;
}
//1, 假设程序new Thread(new Input1(r1)).start() 这个线程先开启,
public void run() {
int i = 0;
while (true) {
if (i == 0)
//2, 程序走到这里, 调用 set方法, 执行该方法
res.set("123", "456");
else if (i == 1) {
//5, 继续循环执行到这里, 再调用set方法
res.set("ggggg", "asdf");
}
//4, 当 res.set("123", "456")方法结束, 执行这里, i == 1, 然后程序,继续while循环,
i = (i + 1) % 2;
}
}
}
class Output1 implements Runnable {
Resource1 res;
Output1(Resource1 res) {
this.res = res;
}
public void run() {
while (true) {
//7, 线程被唤醒执行.
res.get();
}
}
}
下面的代码是正确代码::
public class Demo {
public static void main(String[] args) {
Resource1 r1 = new Resource1();
new Thread(new Input1(r1)).start();
new Thread(new Output1(r1)).start();
}
}
class Input1 implements Runnable {
Resource1 res;
Input1(Resource1 res) {
this.res = res;
}
public void run() {
int i = 0;
while (true) {
if (i == 0) {
res.set("123", "456");
} else if (i == 1) {
res.set("ggggg", "asdf");
}
i = (i + 1) % 2;
}
}
}
class Output1 implements Runnable {
Resource1 res;
Output1(Resource1 res) {
this.res = res;
}
public void run() {
while (true) {
res.get();
}
}
}
class Resource1 {
private String name;
private String sex;
boolean flag = false;
public synchronized void set(String name, String sex) {
if (flag) {
try {
this.wait();
} catch (Exception e) {
System.out.println(e.toString());
}
}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
public synchronized void get() {
if (!flag) {
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println(this.name + "....." + this.sex);
flag = false;
this.notify();
}
}
}
|