Java-多线程-等待与唤醒机制

package cn.bruce.Thread;

//同步通信案例  目的:交替出现正确的输入值
public class WaitandWakeDemo {
    public static void main(String[] args) {
        Value v = new Value();// 建立唯一对象
        input in = new input(v);
        output ou = new output(v);
        Thread t0 = new Thread(in);
        Thread t1 = new Thread(ou);
        t0.start();
        t1.start();
    }
}

class Value {
    String name;
    int age;
    boolean flag = false;

    public Value()
    {
    }

    public Value(String name, int age)
    {
        this.name = name;
        this.age = age;
    }
}

class input implements Runnable {
    int i;
    Value v;

    public input(Value v)// 要使用同一个对象传入
    {
        this.v = v;
    }

    public void run() {
        while (true)
        {
            synchronized (v)// 同步代码块,与另一个进程使用同一个对象锁
            {
                if (v.flag)
                {
                    try
                    {
                        v.wait();
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
                if (i % 2 == 0)
                {

                    v.name = "张三";
                    v.age = 18;

                } else// 必须要等上面的值输出后再换成下面的输入
                {

                    v.name = "李四";
                    v.age = 28;
                }
                v.flag = true;
                v.notify();//唤醒
            }
            i++;
        }
    }
}

class output implements Runnable {
    Value v;

    public output(Value v)// 要使用同一个对象传入
    {
        this.v = v;
    }

    public void run() {
        while (true)// 这里要等上面换了输入后再能再次打印
        {
            synchronized (v)// 同步代码块,与另一个进程使用同一个对象锁
            {
                // 判断标记 如果是false 那就等待
                if (!v.flag)
                {
                    try
                    {
                        v.wait();
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
                System.out.println(v.name + "..." + v.age);
                // 标记改为false
                v.flag = false;
                v.notify();
            }
        }
    }
}

原文地址:https://www.cnblogs.com/BruceKing/p/13589733.html