Java 简单的线程程序,了解同步、等待和通知

Java 简单的线程程序,了解同步、等待和通知,java,multithreading,synchronization,Java,Multithreading,Synchronization,我在这里和其他网站上看到了其他的例子,我不明白我做错了什么。我试图做一个程序,一个线程将一个对象的值设置为1到10,但我想等待它改变值,直到其他线程读取它,这样我就可以打印它们,并有一个从1到10的列表 我的readThread运行方法只是从1到10循环调用以下方法: private synchronized int receive() { try { wait(); int value = this.mainThread.getValor();

我在这里和其他网站上看到了其他的例子,我不明白我做错了什么。我试图做一个程序,一个线程将一个对象的值设置为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;  
}
private synchronized void send(int n) {
    try {
        this.mainThread.setValor(n);
        notify();
        wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
我的writeThread运行方法只是从1到10循环调用以下方法:

private synchronized int receive() {
    try {
        wait();
        int value = this.mainThread.getValor();
        notify();
        return value;
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return -1;  
}
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
不会自动唤醒。出于这一点和其他原因,您确实希望
等待
while
循环中。

正如Tom在下面提到的,存在许多潜在问题。正如代码所示,这是生产者-消费者问题的一个很好的例子。我发现缺少的主要一点是,无法判断何时产生(写入)了值,何时消耗(读取)了值。如果你加上这一点,我想你会让它工作的。