子弹射击

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();}
}

Output Description

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

解题代码

// Bullet 类
class Bullet {// isLoad 是否上膛private boolean isLoad = false;// count 射击次数private int count = 0;// set get方法public boolean isLoad() {return isLoad;}public void setLoad(boolean load) {isLoad = load;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}
}// AddBullet类 相当于生产者线程 实现Runnable接口
class AddBullet implements Runnable {// bullet成员 子弹private Bullet bullet = null;// 构造方法public AddBullet(Bullet bullet) {this.bullet = bullet;}// 实现run方法 线程启动之后 会执行run方法@Overridepublic void run() {// 循环while (true) {// 同步代码块 synchronized (bullet) {// 如果 子弹没有上膛 并且 射击次数小于等于2 count从0开始if (!bullet.isLoad() && bullet.getCount() <= 2) {// 打印信息System.out.println("lock and load~~~~");// 将子弹设置为上膛状态bullet.setLoad(true);}// 唤醒其它线程(消费者线程) bullet.notifyAll();try {// 如果射击次数大于2 代表已经射击了3次 0 1 2if (bullet.getCount() > 2) {// 跳出循环 break;// 如果没有射击3次} else {// 调用wait方法 释放锁并使当前执行线程处于等待状态bullet.wait();}} catch (Exception e) {e.printStackTrace();}}}}
}// ShootBullet类 相当于消费者线程 实现Runnable接口
class ShootBullet implements Runnable {// bullet 成员 子弹private Bullet bullet = null;// 构造方法public ShootBullet(Bullet bullet) {this.bullet = bullet;}// 实现run方法@Overridepublic void run() {// 循环while (true) {// 同步代码块synchronized (bullet) {// 如果 子弹已经上膛 并且 射击次数小于等于2if (bullet.isLoad() && bullet.getCount() <= 2) {// 打印信息System.out.println("fire!!!");// 将射击次数加1bullet.setCount(bullet.getCount() + 1);// 将子弹设置为未上膛状态bullet.setLoad(false);}// 唤醒其它所有线程(生产者线程)bullet.notifyAll();try {// 如果射击次数大于2 代表已经射击了3次 0 1 2if (bullet.getCount() > 2) {// 跳出循环 break;// 如果没有射击3次} else {// 调用wait方法 释放锁并使当前执行线程处于等待状态bullet.wait();}} catch (Exception e) {e.printStackTrace();}}}}
}

(OJ)Java多线程-子弹射击相关推荐

  1. Java多线程编写简易飞机大战(一)

    ** Java多线程编写简易飞机大战(一) ** 利用多线程编写飞机大战,主要有3个关键: ①继承Thread类,重写run方法: ②线程工作代码在run方法中写: ③启动时,调用线程对象的start ...

  2. Java 多线程线程安全(面试概念解答二)

    Java 多线程线程安全 什么是线程安全? 为什么有线程安全问题? 线程安全解决办法? 同步代码块 同步函数 静态同步函数 多线程死锁 多线程的三大特性 原子性 可见性 有序性 Java内存模型 Vo ...

  3. Java Swing打猎射击游戏编程代码下载

    代码下载地址:http://www.zuidaima.com/share/1858069987494912.htm 原文:Java Swing打猎射击游戏编程代码下载 这是一款java swing编写 ...

  4. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  5. Java 多线程的基本方式

    Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

  6. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数

    Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...

  7. Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService

    一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...

  8. 【收藏】Java多线程/并发编程大合集

    (一).[Java并发编程]并发编程大合集-兰亭风雨    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [ ...

  9. 40个Java多线程问题总结

    (转) 这篇文章作者写的真是不错 40个问题汇总 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所 ...

最新文章

  1. java jdwp如何关闭_蚀-本机方法中的致命错误:JDWP没有初始化传输,jvmtiError = AGENT_ERROR_TRANSPORT_INIT(197)...
  2. python代码规范工具_如何检查python3中的代码规范
  3. 机器学习实际应用_机器学习的实际好处是什么?
  4. Feature Engineering 特征工程 3. Feature Generation
  5. 数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案
  6. Hibernate与MyBatis区别
  7. Python os.walk() 方法--输出在目录中的文件名
  8. 比较一下以“反射”和“表达式”执行方法的性能差异【转】
  9. asp.net(c#)网页跳转七种方法小结
  10. 跨域访问的相关概念及解决方法
  11. 各机器学习平台视频建模功能汇总
  12. edius裁剪快捷键_edius5.0常用快捷键 edius快捷键使用大全
  13. 2017ps计算机考证
  14. centos 打包某个目录_CentOS 打包压缩文件 zip 命令详解
  15. c51单片机汇编语言指令,单片机汇编语言指令
  16. HTML文本编辑器BBEdit 14 for Mac
  17. 五险一金 | 2020年个人所得税税率表
  18. 嵌入式linux ASoC架构声卡驱动开发
  19. JavaScript实现网站首页动态效果
  20. 获取截止本月之前12个月的月份

热门文章

  1. 火焰纹章核心功能的实现
  2. IPv6 NDP——邻居发现协议
  3. 华为系统云服务器地址,华为系统云服务器地址
  4. 如何学习(Java)
  5. 自媒体是如何赚钱的?分享如何做自媒体能赚到钱!
  6. 【项目实战】IPC摄像头在线状态ping检测与告警邮件发送项目总结
  7. 蓝桥杯Python初级组测试题之Turtle画图2
  8. arm linux打印机驱动编译方法,嵌入式linux驱动打印机HP系列
  9. Zabbix 邮件报警、钉钉报警、微信报警
  10. matplotlib 的 spines模块详解