并发编程大师系列之:wait/notify/notifyAll/condition

Posted zhangjianbing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程大师系列之:wait/notify/notifyAll/condition相关的知识,希望对你有一定的参考价值。

先把例子写出来,有空再补充。。。

 

/**
 * @author itachi
 * @Title: Express
 * @Description: 快递类
 * @date 2018/7/4下午10:27
 */
public class Express {

    // 始发地
    private final static String CITY = "ShangHai";

    // 里程变化
    private int km;

    // 地点变化
    private String site;

    Express() {

    }

    Express(int km, String site) {
        this.km = km;
        this.site = site;
    }

    // 里程数变化,会唤起线程
    public synchronized void changeKm() {
        this.km = 101;
        notify();
    }

    // 地点变化会唤起线程
    public synchronized void changeSite() {
        this.site = "BeiJing";
        notify();
    }

    // 用来监听里程数的变化
    public synchronized void waitKm() {
        while (this.km <= 100) {
            try {
                wait();
                System.out.println(Thread.currentThread().getId() + "-号监听===里程变化===的线程被唤醒了。。。");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getId() + "-号监听===里程变化===的线程去做相应的事了");
    }

    // 用来监听地点的变化
    public synchronized void waitSite() {
        while (CITY.equals(this.site)) {
            try {
                wait();
                System.out.println(Thread.currentThread().getId() + "-号监听===地点变化===的线程被唤醒了。。。");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getId() + "-号监听===地点变化===的线程去做相应的事了");
    }

}

 

/**
 * @author itachi
 * @Title: Test
 * @Description: 测试
 * @date 2018/7/4下午10:40
 */
public class Test {

    // 初始化快递
    private static Express express = new Express(0, "ShangHai");

    // 用来监听里程数变化的线程
    static class CheckKm implements Runnable {
        @Override
        public void run() {
            express.waitKm();
        }
    }

    // 用来监听地点变化的线程
    static class CheckSite implements Runnable {
        @Override
        public void run() {
            express.waitSite();
        }
    }

    public static void main(String[] args) throws InterruptedException{
        // 启动三个线程去监听里程数的变化
        for (int i = 0; i <= 2; i++) {
            new Thread(new CheckKm()).start();
        }

        // 启动三个线程去监听地点的变化
        for (int i = 0; i <= 2; i++) {
            new Thread(new CheckSite()).start();
        }

        // 主线程睡眠一秒,异常信息抛出去
        Thread.sleep(1000);

        // 让快递的地点发生变化
        express.changeSite();
    }

}

 

9-号监听===里程变化===的线程被唤醒了。。。

 

14-号监听===地点变化===的线程被唤醒了。。。
14-号监听===地点变化===的线程去做相应的事了
13-号监听===地点变化===的线程被唤醒了。。。
13-号监听===地点变化===的线程去做相应的事了
12-号监听===地点变化===的线程被唤醒了。。。
12-号监听===地点变化===的线程去做相应的事了
11-号监听===里程变化===的线程被唤醒了。。。
10-号监听===里程变化===的线程被唤醒了。。。
9-号监听===里程变化===的线程被唤醒了。。。

 

以上是关于并发编程大师系列之:wait/notify/notifyAll/condition的主要内容,如果未能解决你的问题,请参考以下文章

并发编程大师系列之:Synchronized的类锁和对象锁

并发编程大师系列之:你真的了解ThreadLocal吗?

《Java并发编程的艺术》之ConcurrentLinkedQueue

掌握系列之并发编程-1.并发基础

并发编程系列之什么是并发协同?

并发编程系列之什么是并发协同?