简单的线程程序来理解同步,等待和通知



我正在这里和其他网站上查看其他示例,但我不明白我做错了什么。我正在尝试做一个程序,一个线程将对象的值设置为值 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循环中。