zoukankan      html  css  js  c++  java
  • 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();
                        }
                    }
                }
            }
        }
    }
    

      

  • 相关阅读:
    轮廓 | outline (Basic User Interface)
    转换 | CSS Transitions (Animations & Transitions)
    越线 | line-break (Text)
    贴士和技巧 | CSS Animations: Tips (Animations & Transitions)
    负 | @counter-style.negative (Counter Styles)
    调整 | resize (Basic User Interface)
    再见乱码:5分钟读懂MySQL字符集设置
    git
    Python 内存&函数调用关系图
    Python 笔记
  • 原文地址:https://www.cnblogs.com/smartsmile/p/11607949.html
Copyright © 2011-2022 走看看