Problem C: 子弹射击

该文章展示了一个使用Java实现的生产者消费者问题的示例,具体是一个射击场景。Bullet类作为共享资源,AddBullet类负责上膛(生产子弹),ShootBullet类负责射击(消费子弹)。通过线程同步机制,确保在枪中有子弹时才能射击,并在子弹耗尽后重新装弹。程序运行结果会显示lockandload~~~~(上膛)和fire!!!(射击)各三次。

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

采用Java线程计数实现一个射击场景的生产者消费者程序:每上膛一颗就射击一颗。
请补充完整下面的代码:(结果只显示三次)

Output Description


// 你的代码将嵌入这里
class Main{
        public static void main(String[] args) {
                Bullet bullet=new Bullet();
                AddBullet ab=new AddBullet(bullet);
                ShootBullet sb=new ShootBullet(bullet);
                Thread t1=new Thread(ab);
                Thread t2=new Thread(sb);
                t1.start();
                t2.start();
        }
}

Output Description

lock and load~~~~
fire!!!
lock and load~~~~
fire!!!
lock and load~~~~
fire!!!

源码

class Bullet implements Runnable {
    public static int count = 3;//子弹总数
    public static Bullet bu;//锁
    public static Boolean status = Boolean.FALSE;//枪里是否有子弹

    @Override
    public void run() {

    }
}

class AddBullet extends Bullet {


    public AddBullet(Bullet bullet) {
        bu = bullet;
    }

    @Override
    public void run() {
        while (true) {//循环
            synchronized (bu) {//同步代码块
                if (count == 0) {//循环终止条件
                    break;
                } else {//循环继续条件
                    if (status) {
                        try {//枪里有子弹
                            bu.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }


                    }
                    else {//枪里没有子弹
                        System.out.println("lock and load~~~~");//上子弹
                        status=Boolean.TRUE;//状态改为有子弹
                        bu.notifyAll();//唤醒其他进程
                    }
                }


            }
        }
    }
}

class ShootBullet extends Bullet {


    public ShootBullet(Bullet bullet) {
        bu = bullet;
    }

    @Override
    public void run() {
        synchronized (bu) {

            while (true) {
                synchronized (bu) {
                    if (count == 0) {
                        break;
                    } else {
                        if (!status) {
                            try {
                                bu.wait();
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }


                        } else {
                            System.out.println("fire!!!");

                            count--;
                            status = Boolean.FALSE;
                            bu.notifyAll();
                        }
                    }


                }
            }


        }
    }
}
// 你的代码将嵌入这里
class Main{
        public static void main(String[] args) {
                Bullet bullet=new Bullet();
                AddBullet ab=new AddBullet(bullet);
                ShootBullet sb=new ShootBullet(bullet);
                Thread t1=new Thread(ab);
                Thread t2=new Thread(sb);
                t1.start();
                t2.start();
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值