码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-07-04 23:39:34      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:imp   变化   final   change   睡眠   new   static   rip   hang   

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

 

/**
 * @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

标签:imp   变化   final   change   睡眠   new   static   rip   hang   

原文地址:https://www.cnblogs.com/zhangjianbing/p/9265910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!