wait()和notify()

线程暂停:

Thread.wait()需要notify()方法激活,notify是Object类提供的方法,只能激活当前第一个上锁状态的线程,或者优先级高的线程,而notifuAll可以全部解锁

以下是实例:

//生产类
class    DataProvider implements Runnable {
    private Data data;
    public DataProvider(Data data) {
        this.data = data;
    }
    public void run() {
        for(int x = 0; x < 100; x ++) {
            if(x % 2 == 0) {
                this.data.set("苹果","水果");    //设置产品1
            } else {
                this.data.set("苹果","手机");    //设置产品2
            }
        }
    }
}
//消费者类
class    DataConsumer implements Runnable {
    private Data data;
    public DataConsumer(Data data) {
        this.data = data;
    }
    public void run() {
        for(int x =0; x < 50; x ++) {
            try {
                Thread.sleep(10);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            this.data.get();    //每10ms获取从中介处获取产品
        }
    }
}
//中介类
class    Data {
    private String title;    //商品名
    private String note;    //商品标签
    private boolean flag = false;    //生产消费控制

    public synchronized void set(String title,String note) {
        while(this.flag == true) {        //商品流通时不补给
            try{
                super.wait();    //继承Object类
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
//        商品不流通时补给
        this.title = title;    
        this.note = note;
//        补给完毕开始流通        
        this.flag = true;    
        super.notify();    //给第一个锁解锁(当前运行消费者类的线程上锁状态)
    }
    
    public synchronized void get() {
        while(flag == false) {    //补给时不能购买
            try {
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
//        不补给时可以购买
        System.out.println(this.title+" = "+this.note);
        this.flag = false;    //购买完毕开始补给
        super.notify();    //给上锁的解锁(当前运行生产者类的线程上锁状态)
    }
}


public class TestDemo{
    public static void main(String[] args)    {
        Data data = new Data();    //实例化中介类
        new Thread(new DataProvider(data)).start();    //把中介类设置成生产类的成员,用线程启动生产类
        new Thread(new DataConsumer(data)).start();    //把同一个中介类设置成消费者类的成员,用线程启动
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值