Java23种设计模式------生产者消费者模式
生产者消费者模式是个非常经典的多线程协作的设计模式，
生产者消费者模式实际上是包含两类线程：
    一类是生产者，用来生产数据
    一类是消费者，用来消费数据
为了解耦生产者和消费者之间的关系，一般会采用共享的数据区域，就像一个仓库。
生产者生产数据之后，直接放置在共享数据区域种，不需要关心消费者的行为。
消费者只需要从共享区域种获取数据就可以了，不需要关心生产者的行为。

Object类提供等待线程和唤醒线程的方法：
void wait() 导致当前的线程等待，不限时等待。直到另一个线程调用了该对象的notify()方法或notifyAll()方法
void notify()   唤醒正在等待【对象监视器】(锁)的单个线程
void notifyAll()唤醒等待的所有线程

案例：
桌子类(Desk)：定义表示包子数量的变量,定义锁对象变量,定义标记桌子上有无包子的变量
生产者类(Cooker)：实现Runnable接口，重写run()方法，设置线程任务
    1.判断是否有包子,决定当前线程是否执行
    2.如果有包子,就进入等待状态,如果没有包子,继续执行,生产包子
    3.生产包子之后,更新桌子上包子状态,唤醒消费者消费包子
消费者类(Foodie)：实现Runnable接口，重写run()方法，设置线程任务
    1.判断是否有包子,决定当前线程是否执行
    2.如果没有包子,就进入等待状态,如果有包子,就消费包子
    3.消费包子后,更新桌子上包子状态,唤醒生产者生产包子
测试类(Demo)：里面有main方法，main方法中的代码步骤如下
    创建生产者线程和消费者线程对象
    分别开启两个线程

一直使用线程成本比较高，频繁的创建和销毁线程成本比较高？
线程的状态：
    线程创建并启动后，并不是一启动就进入到执行状态，也不是一直处在等待或执行状态。
    线程对象在不同的时期有不同的状态，那么Java线程到底存在几种状态？

    根据Java提供的线程类Thread的内部枚举类提供的状态划分：
        1、NEW 新建状态
            |-也叫初始状态，开始状态，就是线程刚被的创建，但是没有被启动，还没有调用start方法，
            类似 Thread t=new Thread() 的情况，但是t只是线程对象，不具备线程特征
        2、RUNNABLE 就绪状态 可运行状态
            |-当我们调用了start方法，那么此时线程对象进入到了RUNNABLE状态，才是真正的在JVM进程种创建了一个线程。
            线程一启动并不是立刻就能够执行的，它暂时没有执行权，线程能不能允许，要听CPU的调度。我们把这个中间状态(新建和运行的中间状态)称为可执行状态。
            也就是说当前这个线程具备了可以执行的资格，但是没有真正的执行起来，需要等CPU调度。
        3、BLOCKED   阻塞状态
            |-当一个线程想要获取一个对象锁，但是这个对象锁被其他线程持有，那么当前线程就进入到了BLOCKED状态也就是阻塞状态。
            假如当前线程获取到了对象锁，那么它会重新进入到RUNNABLE状态。
        4、WAITING   无限时等待
            |-一个正在等待的线程状态，就是所谓的等待状态，造成等待状态的原因有两个：
                1、调用了Object类的wait()方法。
                2、调用了Thread类的join()方法。
                处在等待状态的线程，会等待其他线程执行一个特定的操作，
                比如A线程是由于wait方法，导致的等待，它就需要等其他线程调用notify或notifyAll方法才能被唤醒
                比如B线程是由于join()方法导致的等待，那么它就需要等待其他线程结束，才会恢复。
        5、TIMED_WAITING 计时等待
            |-在一个限定的时间内等待的线程状态，也叫限时等待状态。造成限时等待的状态的方式有三种：
                1、Thread.sleep(long ms)     睡眠
                2、Object.wait(long ms)      等待
                3、Thread.join(long ms)      等待
        6、TERMINATED    终止
            |-是一个完全运行完成的线程的状态，所以叫终止状态，结束状态。
    我们可以通过Thread的getState()方法来获取线程当前的状态

    操作系统--线程的5种状态
        1、新建
        2、就绪
        3、运行
        4、阻塞
        5、终止
    Java的线程6种状态：
        1、新建
        2、可运行
        3、无限时等待
        4、计时等待
        5、阻塞
        6、终止


