Java线程间同步问题解决

一 点睛

Java通过Object类的wait()、nofity()、nofityAll()这几个方法实现线程间通信。

wait():通知当前线程进入休眠状态,直到其他线程进入并调用nofity()或nofityAll()方法为止。

nofity():唤醒在该同步块中的第1个调用wait()的线程。

notifyAll():唤醒该同步代码块中调用wait()的所有线程,具有最高优先级的线程,首先被唤醒并执行。

二 实战

class Producer implements Runnable {
    private Person person = null;

    public Producer( Person person ) {
        this.person = person;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; ++i) {
            if (i % 2 == 0) {
                person.setValue("张三", "男");
            } else {
                person.setValue("李四", "女");
            }
        }
    }
}

class Consumer implements Runnable {
    private Person person = null;

    public Consumer( Person person ) {
        this.person = person;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; ++i) {
            person.getValue();
        }
    }
}

class Person {
    private String name;
    private String sex;
    private boolean bFull;

    Person( String name, String sex, boolean flag ) {
        this.name = name;
        this.sex = sex;
        this.bFull = flag;
    }

    public synchronized void getValue() {
        if (bFull == false) {
            try {
                wait(); // 后来的线程要等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(this.name + " ---->" + this.sex);
        bFull = false;
        notify(); // 唤醒最先到达的线程
    }

    public synchronized void setValue( String name, String sex ) {

        if (bFull == true) {
            try {
                wait(); // 后来的线程要等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.name = name;
        this.sex = sex;

        bFull = true;
        notify(); // 唤醒最先到达的线程
    }
}

public class ThreadCommunation {
    public static void main( String[] args ) {
        Person person = new Person("李四", "女", true);
        new Thread(new Producer(person)).start();
        new Thread(new Consumer(person)).start();
    }
}

三 运行

李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男
李四 ---->女
张三 ---->男

四 说明

Java线程间同步问题解决_第1张图片

你可能感兴趣的:(java)