java 线程notify和wait问题(急)

来源:百度知道 编辑:UC知道 时间:2024/06/07 04:42:43
public class MyThread extends Thread {
public int total;

public MyThread(String threadname){
this.threadname=threadname;
}

public static void main(String[] args) {
MyThread thread1=new MyThread("A");
thread1.start();
synchronized (thread1) {
try {
System.out.println("计算中。。。。");
thread1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("total:"+thread1.total);
}

public void run() {
synchronized (this) {
for (int i = 1; i < 11; i++) {
this.total += i;
}
// this.notify();//发现这句没有影响
}
}

}
发现不调用notify()程序仍然可以正确运行,不明白wait和notify之间的关系了,不是必须组合使用的吗?请哪位大牛给解释下

System.out.println("total:"+thread1.total);这句是在main的主线程上,当然会执行了。而当thread1.start();
以后 this.total += i;就已经执行了,你再去 thread1.wait();就没有意义了嘛。所以不是notify没起作用,而是你的测试程序写的有问题。
把System.out.println("total:"+thread1.total);放到 thread1.wait();
下面就起作用了。

public final void notify()
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。

此方法只应由作为此对象监视器的所有者的线程来调用。

notify()是用来给别的线程调用的,自己如果已经处于wait状态了,当然不能再调用notify()了,你的那句没作用是因为调用的时候当前线程中没有处于sleep和wait状态的,即你的notify()在wait()之前执行的,等于没作用。

synchronized (thread1) {
try {
System.out.println("计算中。。。。");
thread1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("total:"+thread1.total);
这段代码不能放在main()方法里。

程序运行到thre