当前位置: 代码迷 >> J2EE >> java 线程的wait与nofity求指导,下面是小弟我的简单程序
  详细解决方案

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

热度:83   发布时间:2016-04-17 23:27:29.0
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后不能运行
------解决思路----------------------
在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()。
  相关解决方案