wait和notify是根类Object两个方法。任何类都可以调用该方法。
下面代码实现两个线程通信方式。来自《java程序员面试秘籍》
package myself;
public class Syn {
public static void main(String[] args) {
TwoPeople.ONE.start();
TwoPeople.TWO.start();
}
}
class TwoPeople extends Thread{
private int i = 0;
static Thread ONE = new TwoPeople(1);
static Thread TWO = new TwoPeople(2);
static Object washroom = new Object();
private TwoPeople(int i)
{
this.i = i;
}
private void brush()
{
System.out.println("people"+i+" is brushing");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("people"+i+" has brushed");
}
private void release()
{
System.out.println("People "+i+" is releasing!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("People "+i+" has released!");
}
@Override
public void run() {
//我们加锁的对象是washroom,而不是this对象。所以我们调用的是washroom.wait()和washroom.notify().
<span style="white-space:pre"> </span>//如果省去washroom.会抛出IllegalMonitorStateException。因为this对象上没有加锁。
synchronized(washroom)
{
try{
if(i==1)
{
brush();
<strong><span style="color:#ff0000;">washroom.wait();</span></strong>//添加当前线程到washroom的等待集中
release();
<strong><span style="color:#ff0000;">washroom.notify()</span></strong>;
}else{
brush();
<span style="color:#ff0000;"><strong>washroom.notify();
washroom.wait();</strong></span>
release();
}
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}