线程间的通信机制

wait:会让出对象锁,同时,当前线程休眠,等待被唤醒,如果不被唤醒,就一直等在那儿。
notify:并不会让当前线程休眠,但会唤醒休眠的线程。

生产者和消费者案例

package XianCheng;

public class BaoZi {
    String name;//包子名称
    boolean flag;//包子的状态(true表示存在false表示不存在)
}
package XianCheng;

public class ChiHuo extends Thread{
    BaoZi baozi;

    //构造方法:用来指定线程的名字和要操作的资源
    public ChiHuo(String name,BaoZi bz) {
        super(name);
        this.baozi = bz;
        /**
         * 对于吃货------消费者:
         * 如果包子 不存在 进入等待状态
         * 如果包子 存在  进入执行状态,吃包子。吃完之后包子变为不存在﹑此时唤醒早餐店制作包子
         */

    }
    public void run(){
        String threadName=Thread.currentThread().getName();
        int count=0;
        while (true){
            synchronized (baozi){
                count++;
                if (count>10){
                    break;
                }
                if (baozi.flag){//如果包子存在
                    System.out.println(threadName+"开始吃"+baozi.name) ;//吃包子
                    baozi.notify(); //唤醒同一资源下的其他线程
                }else {//如果包子不存在
                    try {
                        baozi.wait();
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
package XianCheng;

public class ZaoCanDian extends Thread{
    BaoZi baozi;

    //构造方法:用来指定线程的名字和要操作的资源
    public ZaoCanDian(String name, BaoZi bz) {
        super(name);
        this.baozi = bz;
        /**
         * 对于早餐店----生产者:
         * 如果包子﹑不存在 ―进入执行状态,制造包子。制作完毕包子存在,唤醒吃货
         * 如果包子 存在 进入等待状态
         */

    }
    public void run(){
        String threadName=Thread.currentThread().getName();
        int count=0;
        while (true){
            synchronized (baozi){
                count++;
                if (count>10){
                    break;
                }
                if (baozi.flag){//如果包子存在
                    try {
                        baozi.wait();
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }else {//如果包子不存在
                    System.out.println(threadName+"开始制作"+baozi.name) ;//制作包子
                    baozi.notify(); //唤醒同一资源下的其他线程
                }
            }
        }
    }
}
package XianCheng;

public class ThreadTest01 {
    public static void main(String[] args) {
        //定义资源对象
        BaoZi baozi=new BaoZi();
        baozi.name="韭菜鸡蛋";
        baozi.flag=true;

        //定义两个线程,起名字且操作同一个对象
        ChiHuo ch=new ChiHuo("猪八戒" , baozi);
        ZaoCanDian zcd=new ZaoCanDian("春光早餐", baozi);

        //启动线程
        zcd.start();
        ch.start();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜未柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值