黑马程序员技术交流社区
标题:
求助Java线程同步唤醒
[打印本页]
作者:
宁超
时间:
2011-10-12 11:17
标题:
求助Java线程同步唤醒
本帖最后由 宁超 于 2011-10-12 11:45 编辑
class Res {
private String name;
private String sex;
private boolean flag = false;
public synchronized void Set(String name, String sex) {
if (flag) {
try {
this.wait();
} catch (Exception e) {
}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
}
public synchronized void Out() {
if (!flag)
try {
this.wait();
} catch (Exception e) {
}
System.out.println(name + "......." + sex);
flag = false;
this.notify();
}
}
class Input implements Runnable {
private Res r;
Input(Res r) {
this.r = r;
}
public void run() {
int x = 0;
while (true) {
if (x == 0)
r.Set("mike", "man");
else
r.Set("小红", "女");
x = (x + 1) % 2;
}
}
}
class Output implements Runnable {
private Res r;
Output(Res r) {
this.r = r;
}
public void run() {
while (true) {
r.Out();
}
}
}
public class ThreadWaitDemo {
public static void main(String args[]) {
Res r = new Res();
new Thread(new Input(r)).start();
new Thread(new Output(r)).start();
}
}
复制代码
看完比老师后视频写的。但是执行不出来。谁帮看下。
作者:
许冉
时间:
2011-10-12 11:40
new Thread(new Input(r)).start();
new Thread(new Input(r)).start();
弄了两个Input,没有Output
作者:
宁超
时间:
2011-10-12 11:43
我改了还是的。。
作者:
许冉
时间:
2011-10-12 11:59
本帖最后由 xuan 于 2011-10-12 12:08 编辑
上回错了
public synchronized void Set(String name, String sex) {
while (flag) { //最好换成while
try {
this.wait();
} catch (Exception e) {
}} // while结束在这
this.name = name;
this.sex = sex;
flag = true; //这里应该是true,我搞错了
this.notify();
System.out.println("--");
}
public synchronized void Out() {
while (!flag){
try {
this.wait();
} catch (Exception e) {
}}
System.out.println(name + "......." + sex);
flag = false;
this.notify();
}
作者:
许冉
时间:
2011-10-12 12:11
不过你原来的代码只要改一处
if (flag) {
try {
this.wait();
} catch (Exception e) {
} } //把if 的结束括号放这里
this.name = name;
this.sex = sex;
flag = true;
this.notify();
作者:
ruanjianxzh
时间:
2011-10-12 12:22
Input中d的r只是局部的,main方法中得r的属性一直没有变
作者:
宁超
时间:
2011-10-12 12:32
找到问题了。
if (flag) {
try {
this.wait();
} catch (Exception e) {
}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
复制代码
if 那多了层大括号
作者:
许冉
时间:
2011-10-12 13:11
宁超 发表于 2011-10-12 12:32
找到问题了。if 那多了层大括号
恩,if管的太宽了
作者:
郭敏
时间:
2011-10-12 13:45
Res 中Set方法。 线程在调有该方法时先判读flag的值, 如果为真才运行,为假则跳过! 初始值为 false, 即使Input 得到CPU执行权,也无法将值设置给Res类中的name,sex。而在Out 方法中。先判读 !flag ,如为真,则线程wait().
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2