• 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();
                        }
                    }
                }
            }
        }
    }
    

      

  • 相关阅读:
    TSQL与PL/SQL的比较
    春天预防生病
    PyG(pytorchgeometric)安装
    TensorFlow 安装与环境配置(anaconda下)
    古诗今语
    多标签分类和多分类
    RequestsDependencyWarning: urllib3 (1.26.7) or chardet (2.3.0)/charset_normalizer (2.0.4) doesn't match a supported version!
    Anacoda 安装pytorch
    所有的业务系统都是在做数据的维护和读取
    解决ORA04091行触发器中访问变异表的难题
  • 原文地址:https://www.cnblogs.com/smartsmile/p/11607949.html
Copyright © 2020-2023  润新知