线程协作案列

本文通过一个汉堡店的例子展示了如何使用Java的wait和notify方法实现生产者消费者问题。生产者线程制作汉堡并放入容器,消费者线程取出并消费汉堡,当容器满或空时,线程间通过wait和notify进行同步控制,确保资源的有效利用。代码示例中,生产者和消费者线程不断运行,模拟实际场景。
摘要由CSDN通过智能技术生成

线程协作

这种协作是通过线程之间的握手来实现的,这种握手可以通过Object的wait()和notify()来安全的实现

1.1生产者和消费者的问题

有一家汉堡店举办吃汉堡比赛,决赛时有3个顾客来吃,3个厨师来做,一个服务员负责协调汉堡的数量。为了避免浪费,制作好的汉堡被放进一个能装有10个汉堡的长条状容器中,按照先进先出的原则取汉堡。如果容器被装满,则厨师停止做汉堡,如果顾客发现容器内的汉堡吃完了,就可以拍响容器上的闹铃,提醒厨师再做几个汉堡出来。此时服务员过来安抚顾客,让他等待。而一旦厨师的汉堡做出来,就会让服务员通知顾客,汉堡做好了,让顾客继续过来取汉堡。

顾客其实就是我们所说的消费者,而厨师就是生产者。

public class Demo04_生成者消费者 {

    public static void main(String[] args) {
        new Producer().start();
        new Consumer().start();
    }

    private static List<Integer> hamburgers  = new ArrayList<Integer>();

    private static class Producer extends Thread{ //生产者

        int i=0;

        public void run() {

            while(true){
                if(hamburgers.size()<10){
                    hamburgers.add(i);  // 生产
                    System.out.println("生产汉堡:  "+i);
                    i++;

                    synchronized (hamburgers) {
                        hamburgers.notifyAll();
                    }

                }else{
                    synchronized (hamburgers) {
                        try {
                            hamburgers.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                }

                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static class Consumer extends Thread{//消费者
        public void run() {
            while(true){
                if(hamburgers.size()>0){
                    System.out.println("消费汉堡:  "+hamburgers.remove(0));  // 消费

                    synchronized (hamburgers) {
                        hamburgers.notifyAll();
                    }

                }else{
                    synchronized (hamburgers) {

                        try {
                            hamburgers.wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }

                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

sleep和wait的区别:
sleep:让线程睡眠指定时间,不释放锁
wait:让线程处于等待状态,释放锁
notify只能唤醒处于wait状态的线程,不能唤醒sleep状态的线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_不吃香菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值