JAVA 生产者和消费者模型

本文介绍了一个基于JAVA的生产者和消费者模型实现案例,通过两个线程分别模拟售票和补票的过程,确保任何时候车站内只有一张车票,涉及线程同步与加锁操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA 生产者和消费者模型

定义车站售票,加入一张车票,才能卖出一张车票。涉及到加锁同步的操作。这里新建一个类继承Thread,有两个加锁的方法。通过新建2个新类分别取调用这个方法。获得一个带锁的方法,该类的其它带锁的方法同时也会被锁住。

1.管理票的类

class Tickets extends Thread{
    int Num;
    boolean enable=ture;//加入enable可以确定sell优先
    Tickets(int Num){//可以初始化票数
        this.Num=Num;
    }

    public synchronized void put(){
        if (enable){//如果可以卖票有效,进入等待,等待通知
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        Num=Num+1;//收到通知后,开始加票
        enable=true;//标记可以卖了
        System.out.println("票数增加一张到:"+Num);
        notify();//通知卖票的,可以开始卖票
    }

    public synchronized void sell(){
        if (!enable){//如果还不能卖票,进入等待,等待通知
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        Num=Num-1;//收到通知后,开始卖票
        enable=false;//标记需要加票了
        System.out.println("票数减少一张到:"+Num);
        notify();//通知加票
    }
}

2.负责卖票的类

class Sell extends Thread{
    Tickets tickets;
    Sell(Tickets tickets){//传入票对象
        super("Sell");
        this.tickets=tickets;
    }
    public  void run(){//启动卖票
        while (true){
        tickets.sell();}
    }
}

3.负责加票的类

class Put extends Thread{
    Tickets tickets;
    Put(Tickets tickets){//传入票对象
        super("Put");
        this.tickets=tickets;
    }

    public void run(){//启动加票
        while (true) {
            tickets.put();
        }
    }
}

4.测试

public class JavaTest {
    public static void main(String arg[]){
        Tickets station=new Tickets(1);//初始票数
        //因为定义了优先卖票,以下线程启动先后无关
        new Put(station).start();
        new Sell(station).start();
    }
}

运行结果

票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值