java多线程——线程间通信之线程等待唤醒机制

来源:互联网 发布:马刺常青 知乎 编辑:程序博客网 时间:2024/04/30 11:00
  • 三个方法
    wait()
    notify()
    notifyAll()
    三个方法都使用在同步中,因为要对持有锁(又叫监控)的线程操作。
    所以要使用在同步中,因为只有同步才具有锁。
  • 为什么这些操作线程的方法均出现在Object类中?
    因为这些方法在操作同步中的线程时候,都必须要标识所操作线程识有锁。只有同一个锁上的被等待的线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。
    也就是说,等待和唤醒必须是同一个锁。
public class Demo1 {    public static void main(String[] args) {        Res res = new Res();        Input i = new Input(res);        Output o = new Output(res);        Thread t1 = new Thread(i);        Thread t2 = new Thread(o);        t1.start();        t2.start();    }}class Res {    private String name;    private String gender;    private boolean flag;    public synchronized void setNameGender(String name, String gender) {        if (flag)            try {                this.wait();            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        this.name = name;        this.gender = gender;        this.flag = true;        this.notify();    }    public synchronized void out() {        if (!this.flag)            try {                this.wait();            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        System.out.println(this.name + " : " + this.gender);        this.flag = false;        this.notify();    }}class Input implements Runnable {    private Res res;    Input(Res res) {        this.res = res;    }    public void run() {        int x = 0;        while (true) {            if (x % 3 == 0) {                res.setNameGender("T-mac", "male");            } else if (x % 3 == 1) {                res.setNameGender("麦迪", "男人");            } else {                res.setNameGender("CBA", "糟糕");            }            x++;        }    }}class Output implements Runnable {    private Res res;    Output(Res res) {        this.res = res;    }    public void run() {        while (true) {            res.out();        }    }}
1 1