繁体   English   中英

将正在运行的线程对象添加到arraylist中

[英]Add running thread objects in to an arraylist

我正在使用Java创建一个小型坦克游戏。 在该游戏中,有时会在游戏网格上的随机位置生成救生袋和硬币堆。 它们的寿命有限寿命届满后便消失了 当它们在网格上可见时,任何坦克都可以在消失之前获得它们。 而且我想将生命包对象和协同对象的列表保留在ArrayList中,以便通过游戏AI算法访问它们。 我希望使用简单的Java知识如下实现上述概念。

以下是我的LifePack类。CoinPile类的行为类似:

public class LifePack extends Thread{
    public int healthBonus;
    public int lifetime;
    public String type;
    public Point location;
    public boolean visible;

    public LifePack(int x,int y,int lifetime){
        location=new Point(x, y);
        this.lifetime=lifetime;
        this.type="health_pack";
        this.visible=true;
        this.start();

    }

    public void run(){
        while(true){

            if(this.lifetime>0){
                try{
                    Thread.sleep(1);
                    if(lifetime%1000==0){
                        System.out.println("Life pack "+this.getId()+" will be disappeared in "+this.lifetime/1000+" s");
                    }
                    this.lifetime--;
                }
                catch(Exception ex){
                    ex.printStackTrace();
                }
            }
            else{
                this.visible=false;
                this.interrupt();
                break;
            }
        }
        System.out.println("Life pack visibility = "+this.visible);
    }


}

我想将新创建的LifePack对象添加到arraylist中,如下所示:

public ArrayList<LifePack> lifePacks;
lifePacks = new ArrayList<LifePack>();

lifePacks.add(new LifePack(x, y, lifeTime));

每次创建新的生命包时,我都会将该生命包对象添加到上面的arraylist中。 生命周期的生存期到期后,我想将上述类中的“ visible ”布尔变量设置为“ false ”,以便可以出于其他目的检查该变量。

但是我没有得到想要的输出。 我可以如上所述将正在运行的线程对象添加到arraylist中,并保持线程状态为运行状态吗?还是必须移至其他实现? 如果有解决方案,请有人帮我解决。

谢谢。

我同意dirkk的观点,即您将增加太多线程。 但是要回答您的问题,也许您应该考虑使用AtomicBoolean作为可见对象。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/atomic/AtomicBoolean.html

据我所知,一个线程检查列表中的某些条目是否为false,其他线程将其设置为false,这需要是线程安全的

您可以通过在更新操作期间同步列表本身来做到这一点

  synchronized(list){
       //update the needed entry to false
  }

如前所述,创建线程是一个坏主意。 特别是,一旦您的应用程序达到了很多生命包的地步。 另请注意,在构造函数中启动线程是非常不好的做法。 如果要使用普通线程,建议实现一个runnable(java.lang.Runnable)。

但是,总的来说,我强烈建议您使用java.util.concurrent包中提供的Java并发抽象: http : //docs.oracle.com/javase/6/docs/api/java/util/concurrent/ package-summary.html使用ExecutorService运行可调用对象(java.util.concurrent.Callable)可使您非常轻松地更改线程数。

我还会质疑您将所有救生袋存储在同一集合中并为每个救生袋分配状态(可见性)的想法。 自发地,我可以想到以下情形:游戏运行了相当长的一段时间后,您将获得大量的生命包,其中大部分不再使用。 因此,您可能要考虑针对生活包所处的不同状态使用不同的集合。这也将使丢弃对象变得非常容易(无需遍历集合)。 假设这些集合可以被多个线程访问,则希望它们是线程安全的。 为此,您还将在java.util.concurrent包中找到各种类型的集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM