Problem C: 子弹射击

文章提供了一个使用Java实现的生产者消费者问题示例,具体是一个射击场景,每次上膛一颗子弹后射击一颗。AddBullet线程负责添加子弹(上膛),ShootBullet线程负责射击。通过共享的Bullet对象和锁机制确保线程安全,实现有限次的射击操作。

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

Problem Description

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


// 你的代码将嵌入这里
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();
        }
}

 

 Input Description

 

 

 Output Description

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

 我的想法:

 我的代码:



class Bullet{
    //是否可以发射子弹
    private boolean flag;
    //子弹的个数
    private int count;
    private int sum;

    public Object getLock() {
        return lock;
    }

    //锁对象
    private final Object lock = new Object();

    public Bullet() {
        this.sum = 0;
        this.count = 1;
        this.flag = false;
    }

    public Bullet(boolean flag, int count) {
        this.flag = flag;
        this.count = count;
    }

    /**
     * 获取
     * @return flag
     */
    public boolean isFlag() {
        return flag;
    }

    /**
     * 设置
     * @param flag
     */
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    /**
     * 获取
     * @return count
     */
    public int getCount() {
        return count;
    }

    /**
     * 设置
     * @param count
     */
    public void setCount(int count) {
        this.count = count;
    }

    public String toString() {
        return "Bullet{flag = " + flag + ", count = " + count + ", lock = " + lock + "}";
    }

    public int getSum() {
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }
}

class AddBullet extends Thread{
    private Bullet bullet;
    public AddBullet(Bullet bullet) {
        this.bullet = bullet;
    }

    @Override
    public void run() {
        while (true){
            synchronized (bullet.getLock()){
                if(bullet.getSum() == 3){

                    break;
                }else {
                    if(!bullet.isFlag()){
                        //
                        bullet.setCount(1);
                        bullet.setSum(bullet.getSum() + 1);
                        System.out.println("lock and load~~~~");
                        bullet.setFlag(true);
                        bullet.getLock().notifyAll();
                    }else {
                        try {
                            bullet.getLock().wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
}

class ShootBullet extends Thread{
    private Bullet bullet;
    public ShootBullet(Bullet bullet) {
        this.bullet = bullet;
    }

    @Override
    public void run() {
        while (true){
            synchronized (bullet.getLock()){
                if(bullet.getSum() == 3){
                    System.out.println("fire!!!");
                    break;
                }else {

                    if(bullet.isFlag()){
                        System.out.println("fire!!!");
                        bullet.setFlag(false);
                        bullet.getLock().notifyAll();
                        bullet.setCount(0);
                    }else {
                        try {
                            bullet.getLock().wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
}



// 你的代码将嵌入这里
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
发出的红包

打赏作者

小木苓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值