我正在这里和其他网站上查看其他示例,但我不明白我做错了什么。我正在尝试做一个程序,一个线程将对象的值设置为值 1 到 10,但我想等待它更改值,直到其他线程读取它,这样我就可以打印它们并有一个从 1 到 10 的列表。
我的 readThread 运行方法只是从 1 循环到 10,调用以下方法:
private synchronized int receive() {
try {
wait();
int value = this.mainThread.getValor();
notify();
return value;
} catch (InterruptedException e) {
e.printStackTrace();
}
return -1;
}
我的 writeThread 运行方法只是从 1 循环到 10,调用以下方法:
private synchronized void send(int n) {
try {
this.mainThread.setValor(n);
notify();
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
主要方法如下:
public static void main(String[] args) {
MainThread mt = new MainThread();
ReadThread rt = new ReadThread(mt);
WriteThread wt = new WriteThread(mt);
wt.start();
rt.start();
}
类 MainThead 具有由其 getter 和 setter 定义的属性"valor">
谢谢你的帮助
有几个明显的问题。
看起来好像您正在同一个锁上同步(没有足够的代码来 100% 确定)。通常,您应该创建一个专门用作锁的对象。
send
可以在receive
之前执行。在这种情况下,第一个notify
将不执行任何操作,并且两个线程都将停滞在wait
中。
理论上,不能保证wait
不会自发醒来。出于这个原因和其他原因,您确实希望wait
位于while
循环中。