Java 每个枚举组件运行一个线程

Java 每个枚举组件运行一个线程,java,multithreading,enums,Java,Multithreading,Enums,作为标题,我有一个带有枚举列表的类,在这个类中我有一个方法newhatcher,它创建了一个线程,我希望在这个时候只运行一个枚举类型的1个线程 我存储一个hashmap,其中包含与我的枚举对应的线程 我正在尝试做但不起作用的是,当满足特定条件时,调用我的方法DestroyOther(type)(从线程中),该方法从hashmap中删除线程,并更改thread的run()方法中的while条件,因此现在它将为false,并再次调用NewOther(在该方法的位置上创建一个新的)线程应该完成方法并结

作为标题,我有一个带有枚举列表的类,在这个类中我有一个方法newhatcher,它创建了一个线程,我希望在这个时候只运行一个枚举类型的1个线程

我存储一个hashmap,其中包含与我的枚举对应的线程

我正在尝试做但不起作用的是,当满足特定条件时,调用我的方法DestroyOther(type)(从线程中),该方法从hashmap中删除线程,并更改thread的run()方法中的while条件,因此现在它将为false,并再次调用NewOther(在该方法的位置上创建一个新的)线程应该完成方法并结束,并且应该创建新的线程

线程从未真正完成,因此我会在稍后一次运行多个线程,并得到意外的结果

public class GameOpponents {

    Radar radar;
    Poi player;
    public enum Type{
        rocket
    }

    Map<Type, Poi> OpponentsMap = new HashMap();
    Map<Type, Thread> OpponentsThreadMap = new HashMap();

 public void newOpponent(){
        Type type = Type.rocket;

        Poi opponent = randomLocationOpponent(type);
        OpponentsMap.put(type, opponent);
        radar.addPoi(OpponentsMap.get(type));

        Thread thread = new Thread(){
            @Override
            public void run(){
                double[] XYSpeed = getXYSpeedTowardsPlayer(type);
                while(OpponentsMap.get(type)!=null){

                    moveOpponent(type, XYSpeed[0], XYSpeed[1]);
                    if(distanceToPlayer(OpponentsMap.get(type))>2) destroyOpponent(type);
                    try {
                        sleep(300);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(GameOpponents.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        };

        if(thread.getState()==Thread.State.NEW){
            OpponentsThreadMap.put(type, thread);
            OpponentsThreadMap.get(type).start();
        }
        else if(OpponentsThreadMap.get(type).getState()==Thread.State.TERMINATED){
            System.out.println("TERMINATED");
            OpponentsThreadMap.replace(type, thread);
            OpponentsThreadMap.get(type).start();
        }

    }

    private void destroyOpponent(Type type){
        radar.removePoi(OpponentsMap.get(type));
        OpponentsMap.remove(type);
        OpponentsThreadMap.remove(type);
        newOpponent();
    }
公共类游戏对手{
雷达;
Poi播放器;
公共枚举类型{
火箭
}
Map OpponentsMap=newhashmap();
Map-OpponentsThreadMap=新HashMap();
公开无效{
Type Type=Type.rocket;
Poi对手=随机定位对手(类型);
对手地图。放置(类型,对手);
radar.addPoi(OpponentsMap.get(type));
线程线程=新线程(){
@凌驾
公开募捐{
double[]XYSpeed=GetxySpeedTowardsLayer(类型);
while(OpponentsMap.get(type)!=null){
移动对手(类型,XYSpeed[0],XYSpeed[1]);
如果(距离顶层(对手地图获取(类型))>2)摧毁对手(类型);
试一试{
睡眠(300);
}捕获(中断异常例外){
Logger.getLogger(gameopactors.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
};
if(thread.getState()==thread.State.NEW){
OpponentsThreadMap.put(类型、线程);
OpponentsThreadMap.get(type.start();
}
else if(OpponentsThreadMap.get(type).getState()==Thread.State.TERMINATED){
系统输出打印项次(“终止”);
OpponentsThreadMap.replace(类型、螺纹);
OpponentsThreadMap.get(type.start();
}
}
私有无效对象(类型){
radar.removePoi(OpponentsMap.get(type));
OpponentsMap.remove(类型);
OpponentsThreadMap.remove(类型);
新对手();
}

你不是在从多个线程修改映射吗?这通常不会有好的结果。而且如果你几乎肯定根本不需要线程来完成这项工作。@pvg我如何实现在不停止主线程的情况下等待每个对象x秒而停止整个程序?我正在从主线程添加映射,并从这些线程中删除单个线程我同意@pvg,你不应该使用你正在使用的所有这些乱七八糟的东西。这是GUI吗?它是以事件驱动的方式编写的吗?@hoverCraftFullOfels否,所有GUI更改都是在EDT/invokelateCondition thread.getState()上完成的==Thread.State.NEW总是正确的,因为线程刚刚创建。你不是在修改多个线程的映射吗?这通常不会有好的结果。而且如果你几乎肯定根本不需要线程来完成这个任务的话。@pvg我怎么能在不停止会停止整个程序的主线程的情况下让每个对象等待x秒呢?我是addin我同意@pvg,你不应该使用你正在使用的所有这些乱七八糟的东西。这是一个GUI吗?它是以事件驱动的方式编写的吗?@hovercraftfullofels否,所有GUI更改都是在EDT/invokelateCondition thread.getState()上完成的==Thread.State.NEW始终为true,因为线程刚刚创建。