• Java 线程之间的通讯,等待唤醒机制


    public class ThreadNotifySample {
        public static void main(String[] args) {
            // Res res = new Res();
            // Input input = new Input(res);
            // Output output = new Output(res);
            // Thread t1 = new Thread(input);
            // Thread t2 = new Thread(output);
            // t1.start();
            // t2.start();
    
            /**
             * 上面会出现下面的情况
             * hangsan----male
             * zhangsan----male
             * zhangsan----male
             * zhangsan----女
             * 李琳----女
             * 李琳----女
             * 李琳----male
             * 李琳----male
             * 李琳----女
             * */
    
            //下面实现了线程之间的通讯,等待唤醒机制,input放进去一个数据,output取出一个数据
            Res res = new Res();
            Input2 i2 = new Input2(res);
            Output2 o2 = new Output2(res);
            Thread t3 = new Thread(i2);
            Thread t4 = new Thread(o2);
            t3.start();
            t4.start();
    
            /**
             * 显示如下
             * zhangsan----male
             * 李琳----女
             * zhangsan----male
             * 李琳----女
             * zhangsan----male
             * 李琳----女
             * zhangsan----male
             * 李琳----女
             * zhangsan----male
             * 李琳----女
             */
    
        }
    }
    
    class Res {
        String userName;
        String userSex;
        boolean flag;
    }
    
    class Input implements Runnable {
        private Res res;
    
        Input(Res res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            int x = 0;
            while (true) {
                if (x == 0) {
                    res.userName = "zhangsan";
                    res.userSex = "male";
                } else {
                    res.userName = "李琳";
                    res.userSex = "女";
                }
                x = (x + 1) % 2;
            }
        }
    }
    
    class Output implements Runnable {
        private Res res;
    
        Output(Res res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            while (true) {
                System.out.println(res.userName + "----" + res.userSex);
            }
        }
    }
    
    
    class Input2 implements Runnable {
        private Res res;
    
        Input2(Res res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            int x = 0;
            while (true) {
                synchronized (res) {  //添加同步代码块,锁定内存中同一个对象
                    if (res.flag) {
                        try {
                            res.wait(); //有数据尚未被Output2取走数据则等待 Output2处理完
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        if (x == 0) {
                            res.userName = "zhangsan";
                            res.userSex = "male";
                        } else {
                            res.userName = "李琳";
                            res.userSex = "女";
                        }
                        x = (x + 1) % 2;
                        res.flag = true; //有数据
                        res.notify(); //放完数据通知Output2来取走数据
                    }
                }
            }
        }
    }
    
    class Output2 implements Runnable {
        private Res res;
    
        Output2(Res res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            while (true) {
                synchronized (res) { //添加同步代码块,锁定内存中同一个对象
                    if (res.flag) { //有数据待处理,则取出处理
                        System.out.println(res.userName + "----" + res.userSex);
                        res.flag = false; //无数据
                        res.notify(); //取完数据通知Input2继续放数据
                    } else {
                        try {
                            res.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    

      

  • 相关阅读:
    [HNOI2010]CITY 城市建设

    [HNOI2011]数学作业
    [NOI2012]美食节
    [HEOI2014]大工程
    [HEOI2013]ALO(待更)
    [HEOI2016/TJOI2016]序列
    贪食蛇(未完待续)
    [HEOI2016/TJOI2016]字符串
    bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
  • 原文地址:https://www.cnblogs.com/smartsmile/p/11607949.html
Copyright © 2020-2023  润新知