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