首页 > 编程语言 > 详细

Java基础教程——线程通信

时间:2019-07-14 00:32:27      阅读:119      评论:0      收藏:0      [点我收藏+]

线程通信:等待、唤醒

Object方法 这些方法在拥有资源时才能调用
notify 唤醒某个线程。唤醒后不是立马执行,而是等CPU分配
wait 等待,释放锁,不占用CPU资源
notifyAll 唤醒全部等待的线程

重点:资源的有效利用

技术分享图片

生产一个,消费一个;再生产一个,再消费一个

以热干面为例(生产者消费者问题):

class 热干面 {
    int isOK = 0;
}
class 生产者 implements Runnable {
    热干面 m;
    public 生产者(热干面 m) {
        this.m = m;
    }
    public void 做面() {
        try {
            synchronized (m) {
                if (m.isOK > Desk.BUFFER_MAX) {
                    System.out.println("+等需要做了再做");
                    m.wait();
                    System.out.println("+开始做");
                }
                m.isOK++;
                System.out.println("+做面" + m.isOK);
                m.notify();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void run() {
        while (true) {
            try {
                Thread.sleep(Desk.做面时间);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            做面(); // 生产面
        }
    }
}
class 消费者 implements Runnable {
    热干面 m;
    public 消费者(热干面 m) {
        this.m = m;
    }
    public void 吃面() {
        try {
            synchronized (m) {// # 锁住面对象
                if (m.isOK <= 0) {
                    System.out.println("------等面");
                    m.wait();// 等待,释放锁
                    System.out.println("------有面了");
                }
                System.out.println("------吃面:" + m.isOK);
                m.isOK--;
                m.notify();// 唤醒另一个线程,但是,俩线程等CPU执行权
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void run() {
        while (true) {
            try {
                Thread.sleep(Desk.吃面时间);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            吃面();
        }
    }
}
class Desk {// 为了管理对象、模拟现实场景,可以不要
    public static final int 做面时间 = 100;
    public static final int 吃面时间 = 100;
    public static final int BUFFER_MAX = 1;
    热干面 msg = new 热干面();
    生产者 m = new 生产者(msg);
    消费者 c = new 消费者(msg);
    Thread t1 = new Thread(m); // 生产者线程
    Thread t2 = new Thread(c); // 消费者线程
    public void fn() {
        t1.start();
        t2.start();
    }
}
public class 生产者消费者问题 {
    public static void main(String[] args) {
        Desk d = new Desk();
        d.fn();
    }
}

Java基础教程——线程通信

原文:https://www.cnblogs.com/tigerlion/p/11182799.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!