1.线程通信的方法
wait()、notify()、notifyAll()
2.说明
1.wait()、notify()、notifyAll()三个方法必须使用在同步代码块或同步方法中。
2.wait()、notify()、notifyAll()三个方法的调用者必须是同步代码块或同步方法
中的同步监视器(锁)
3.wait()、notify()、notifyAll()三个方法是定义在java.lang.Object类中的
3.例子(使用线程通信实现交替买票)
public class App { public static void main(String[] args) throws Exception { sellTicket s = new sellTicket(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } } class sellTicket implements Runnable { private int num = 100; @Override public void run() { while (true) { synchronized (this) { this.notify();//对应说明中的第二条规则 if (num > 0) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "购买了第" + num + "张票"); num--; try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ break; } } } } }
4.与sleep()方法的异同
1.相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。
2.不同点:a.两个方法声明的位置不同,Thread声明sleep(),Object类中声明wait()
b.调用的要求不同:sleep()可以在任何需要的场景下调用,wait()必须使用在同步
代码块或同步方法中
c.关于是否释放同步监视器(锁):如果两个方法都使用在同步代码块或同步方法中,
sleep()不释放同步监视器 ,wait()释放同步监视器。