日期:2014-05-19  浏览次数:20922 次

怎样让所有线程都共用一个list?
想实现一个小游戏。
主面板范围为:800*600
1.舰艇:控制目标,发射炮弹
2.炮弹类(Shoot):
3.飞机类(Fighter):
功能是舰艇可以上下左右移动,并且发射炮弹。炮弹击中飞机的话炮弹和飞机同时结束进行消失。
炮弹是一个线程类,主页面的按钮点击一次产生一个线程,线程遇到飞机或者达到面板外时结束。
飞机也是一个线程,一次性把10个对象都添加到主面板上,10个线程同时启动,但是线程等待时间不同,所以是每隔
2秒出发一架飞机进去主面板。
list是记录10架飞机对象的,我准备把list添加到shoot中,这样每个shoot对象中都可以存有所有飞机的位置,用来判断是否击中飞机。但是每次创建shoot对象中的list好像都是各自独立的,也就是每个shoot中都存有一个各自独立的list,相互不影响,这显示不现实。
求助,怎样才能让这些shoot对象共用一个list?

private List<Fighter> list;

fighter=new Fighter[10];
list=new ArrayList<Fighter>();
for(int i=0;i<10;i++){
fighter[i]=new Fighter(i);//对进飞机进行初始化
fighter[i].setSize(20, 10);
fighter[i].setIcon(feiji);//放置飞机图片
fighter[i].setLocation(820, 200);//初始化位置820超出主面板,不显示
xianshi.add(fighter[i]);//把这个飞机添加到主面板上
new Thread(fighter[i]).start();//线程启动
list.add(fighter[i]);//添加到list
}

//对火力控制界面的监听
shoot=new Shoot[10];//最大允许同时发射10发子弹,超过10发子弹会产生异常

shootBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

//记录线程的数量n
n++;
//初始化一个对象
shoot[n-1]=new Shoot(n,list);//对进行炮弹的位置初始化
shoot[n-1].setSize(10,10);
shoot[n-1].setIcon(zhadan);//显示炸弹的位置
//初始化炮弹的位置
shoot[n-1].setLocation(10*i, 10*(j+1));

xianshi.add(shoot[n-1]);

//点击一次开火就创建一个新的线程
new Thread(shoot[n-1]).start();
}
});

}
//下面是Shoot线程类
public class Shoot extends JLabel implements Runnable {
private int index;
private List<Fighter> list;
private int k=0;



public Shoot(int index,List<Fighter> list){//线程创建了多个对象,每个对象传入的list都是不一样的。
this.index=index;
this.list=list;//能得到list内存储的fighter的位置
System.out.println("这是炸弹"+k);
k++;
}
public void run(){
boolean flag=true;

int len =10;
while(flag){
this.setLocation(this.getX(),this.getY()-len);
//System.out.println(this.getY());
//记录炮弹距离
if(this.getY()<=-10){
flag=false;
}
//对fighter的位置进行遍历,看是否炸弹有击中的飞机,如果有,该炸弹的进程结束
for(int i=0;i<10;i++){
if((this.getX()>=(list.get(i).getX()-9))
&&(this.getX()<=(list.get(i).getX()+11))
&&(this.getY()>=(list.get(i).getY()-1))
&&(this.getY()<=(list.get(i).getY()+9))
){
System.out.println("这是被击中的飞机"+i+" 飞机的位置是:");
System.out.println(list.get(i).getX()-9);
System.out.println(list.get(i).getX()+11);

/*JOptionPane.showMessageDialog(null, "Congratulations!","you Win",
JOptionPane.INFORMATION_MESSAGE,null);*/
System.out.println(Thread.currentThread().getName()+":"+list.get(i).getX());
list.get(i).setFlag();//让被击中的对象Fighter中的飞机也不再运行
flag=false;
}
}
try {
Thread.currentThread().sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//对炸弹的位置进行擦除
this.setIcon(null);
}
}
//下面是Fighter类
public class Fighter extends JLabel implements Runnable{
private int index;
private boolean flag=true;


public Fighter(){};
public Fighter(int index){
this.index=index;
}
public void setFlag(){
this.flag=false;
}


public int getIndex() {
return index;
}

@Override
public void run() {
// TODO Auto-generated method stub
int len=10;
//System.out.println(index);
try {
Thread.curren