Java 简单的线程程序,了解同步、等待和通知
我在这里和其他网站上看到了其他的例子,我不明白我做错了什么。我试图做一个程序,一个线程将一个对象的值设置为1到10,但我想等待它改变值,直到其他线程读取它,这样我就可以打印它们,并有一个从1到10的列表 我的readThread运行方法只是从1到10循环调用以下方法: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();
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在下面提到的,存在许多潜在问题。正如代码所示,这是生产者-消费者问题的一个很好的例子。我发现缺少的主要一点是,无法判断何时产生(写入)了值,何时消耗(读取)了值。如果你加上这一点,我想你会让它工作的。