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

  

你可能感兴趣的:(Java 线程之间的通讯,等待唤醒机制)