* 为避免死锁,就应该让线程在进入阻塞状态时尽量释放其锁定的资源,以为其他的线程提供运行的机会,Object类中定义了几个有用的方法:wait()、notify()、notifyAll()。
1) wait():被锁定的对象可以调用wait()方法,这将导致当前线程被阻塞并释放该对象的互斥锁,即解除了wait()方法当前对象的锁定状态,其他的线程就有机会访问该对象。
2) notify():唤醒调用wait()方法后被阻塞的线程。每次运行该方法只能唤醒一个线程。
3) notifyAll():唤醒所有调用wait()方法被阻塞的线程。
//资源类
class Res{
String name;
String sex;
boolean b;
}
//生产者
class Input implements Runnable{
private Res r;
public Input(Res r){
this.r=r;
}
public void run() {
int x=0;
while(true){
synchronized(r){
if(r.b){
try {
r.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(x==0){
r.name="张三";
r.sex="男";
}else{
r.name="lisi";
r.sex="nv";
}
r.b=true;
r.notify();
}
x=(x+1)%2;
}
}
}
//消费者
class Output implements Runnable{
private Res r;
public Output(Res r){
this.r=r;
}
public void run() {
while(true){
synchronized(r){
if(!r.b){
try {
r.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(r.name+"---"+r.sex);
r.b=false;
r.notify();
}
}
}
}
public class ThreadDemo4 {
public static void main(String[] args) {
Res t=new Res();
Input d1=new Input(t);
Output d2=new Output(t);
Thread t1=new Thread(d1);
Thread t2=new Thread(d2);
t1.start();
t2.start();
}
}