(OJ)Java多线程-子弹射击
子弹射击
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多线程-子弹射击相关推荐
- Java多线程编写简易飞机大战(一)
** Java多线程编写简易飞机大战(一) ** 利用多线程编写飞机大战,主要有3个关键: ①继承Thread类,重写run方法: ②线程工作代码在run方法中写: ③启动时,调用线程对象的start ...
- Java 多线程线程安全(面试概念解答二)
Java 多线程线程安全 什么是线程安全? 为什么有线程安全问题? 线程安全解决办法? 同步代码块 同步函数 静态同步函数 多线程死锁 多线程的三大特性 原子性 可见性 有序性 Java内存模型 Vo ...
- Java Swing打猎射击游戏编程代码下载
代码下载地址:http://www.zuidaima.com/share/1858069987494912.htm 原文:Java Swing打猎射击游戏编程代码下载 这是一款java swing编写 ...
- Java多线程与线程并发库高级应用笔记
以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...
- Java 多线程的基本方式
Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):
- Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数
Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...
- Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService
一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...
- 【收藏】Java多线程/并发编程大合集
(一).[Java并发编程]并发编程大合集-兰亭风雨 [Java并发编程]实现多线程的两种方法 [Java并发编程]线程的中断 [Java并发编程]正确挂起.恢复.终止线程 [ ...
- 40个Java多线程问题总结
(转) 这篇文章作者写的真是不错 40个问题汇总 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所 ...
最新文章
- java jdwp如何关闭_蚀-本机方法中的致命错误:JDWP没有初始化传输,jvmtiError = AGENT_ERROR_TRANSPORT_INIT(197)...
- python代码规范工具_如何检查python3中的代码规范
- 机器学习实际应用_机器学习的实际好处是什么?
- Feature Engineering 特征工程 3. Feature Generation
- 数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案
- Hibernate与MyBatis区别
- Python os.walk() 方法--输出在目录中的文件名
- 比较一下以“反射”和“表达式”执行方法的性能差异【转】
- asp.net(c#)网页跳转七种方法小结
- 跨域访问的相关概念及解决方法
- 各机器学习平台视频建模功能汇总
- edius裁剪快捷键_edius5.0常用快捷键 edius快捷键使用大全
- 2017ps计算机考证
- centos 打包某个目录_CentOS 打包压缩文件 zip 命令详解
- c51单片机汇编语言指令,单片机汇编语言指令
- HTML文本编辑器BBEdit 14 for Mac
- 五险一金 | 2020年个人所得税税率表
- 嵌入式linux ASoC架构声卡驱动开发
- JavaScript实现网站首页动态效果
- 获取截止本月之前12个月的月份