Javaスレッド間の通信、ウェイクアップ待ちメカニズム

4499 ワード

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