Code Bye

java 线程的wait与nofity求指导,下面是我的简单程序

 

public static Integer ours = 10;

new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
synchronized (this) {
try {
wait();
System.out.println(“ours = ” + ours);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();

new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
synchronized (this) {
System.out.println(“ours = ” + ours);
ours–;
notifyAll();
}
}
}).start();

程序输出10后不能运行

这个首先要理解锁的含义和wait是让谁等,notify把谁唤醒,你这个代码也不全,不知道你这个类是不是个线程类,算了给你个参考吧。。。。。。。http://blog.csdn.net/xm4014/article/details/14714
你上面的程序执行流程应该是这样的:第一个线程执行到 wait后,就一直处于等待状态;第二个线程输出10,然后notifyAll并没有唤醒第一个线程,这是因为synchronized (this) 这里的this为线程实例对象本身,你上面两个不同的线程实例,所以this代表的不是一个实例,所以你这里无法起到同步效果。
synchronized (this) , this.wait()   this.notifyAll() ,这3个this要是同一个对象才能达到你的测试目的。
首先明白方法的意思:
当一个线程执行wait()方法时,意味着此线程不再拥有它的锁,而且除了被唤醒,自己是醒不来的。
当一个线程执行notifyAll()方法时,意味着当前线程上处于wait()状态的线程将被唤醒,题中的执行wait()方法的线程不是执行notifyAll()方法的线程的当前对象,所以执行wait()方法的线程并没有被唤醒。

简单的讲:有wait()方法的线程只执行了一般就再没有执行,而有notifyAll()方法的线程执行完了,也就相当于程序执行完了,所以输出10程序就不执行了。


20分
在Java多线程编程中,wait()的作用的是让当前线程进入阻塞状态,notify()是让当前线程唤醒继续执行。虽然是对线程状态的控制,但它们其实都是Object中的方法,这是因为wait与notify所起的作用与线程间的互斥锁有关。

在执行wait()和notify()之前,必须要先获得互斥锁,即一定要和synchronized一起使用。wait()的含义是让出获得的互斥锁,并让自己进入阻塞状态。在notify()的时候也已经获得了互斥锁,所做的事情就是唤醒当前线程继续执行。

假如synchronized的锁对象是obj的话,wait和notify正确的使用方法是obj.wait()和obj.notify()。如果使用this作为锁,则可以直接写成wait()和notify()。如果前后使用的锁对象不一致,会发生IllegalMonitorStateException。

当有多个线程共同使用一个互斥锁时,notify()会随机选取一个执行过wait()的线程唤醒,其余会继续保持阻塞状态。如果想唤醒所有阻塞的进程,就使用到了notifyAll()。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java 线程的wait与nofity求指导,下面是我的简单程序