线程通信

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()释放同步监视器。  
原文地址:https://www.cnblogs.com/shouyaya/p/13386677.html