wait、notify生产者与消费者模型

 

 

package com.mayikt.thread.days02;

/**
 * @author 余胜军
 * @ClassName Thread04
 * @qq 644064779
 * @addres www.mayikt.com
 * 微信:yushengjun644
 */
public class Thread04 {
    /**
     * 共享对象 res
     */
    class Res {
        public String userName;
        public char sex;
        /**
         * flag 默认值==false
         * flag false 输入线程 输入值 输出线程
         * flag true 输出线程 输出值
         */
        public boolean flag = false;
    }

    /**
     * 第一次 输出余胜军,男
     * 第二次 输出小薇,女
     * 第三次 输出余胜军,男
     * 第四次 输出小薇,女
     */
    class InputThread extends Thread {
        private Res res;

        public InputThread(Res res) {
            this.res = res;
        }

        @Override
        public void run() {
            int count = 0;
            while (true) {
                synchronized (res) {
                    if (res.flag) {
                        try {
                            res.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    if (count == 0) {
                        res.userName = "余胜军";
                        res.sex = '';
                    } else {
                        res.userName = "小薇";
                        res.sex = '';
                    }

                    // 输出线程 输出值
                    res.flag = true;
                    // 唤醒输出线程
                    res.notify();
                }
                // 1%2 = 2%2  3%2 4%2=
                count = (count + 1) % 2;

            }

        }
    }

    /**
     * 输出的线程
     */
    class OutPutThread extends Thread {
        private Res res;

        public OutPutThread(Res res) {
            this.res = res;
        }

        @Override
        public void run() {
            while (true) {
                synchronized (res) {
                    if (!res.flag) {
                        // 如果 res.flag=false 则 输出的线程 主动释放锁 同时会阻塞该线程
                        try {
                            res.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                    System.out.println(res.userName + "," + res.sex);
                    // 输出完毕 交给我们的输入线程继续的输入
                    res.flag = false;
                    res.notify();;

                }
            }
        }
    }

    public static void main(String[] args) {
        new Thread04().print();
    }

    public void print() {
        // 全局对象
        Res res = new Res();
        // 输入线程
        InputThread inputThread = new InputThread(res);
        OutPutThread outPutThread = new OutPutThread(res);
        inputThread.start();
        outPutThread.start();
    }

}

 

posted @ 2021-11-27 14:06  AngDH  阅读(34)  评论(0编辑  收藏  举报