我最近做一个小的游戏  在做战斗模块的时候 有一些问题需要请教 
   需求:每一场战斗起一个线程,在战斗的过程中,我需要随时可以找到这个线程,因为在战斗过程中,有可能涉及到逃跑,发大招等操作.我是用一个servlet做的   1 首先我要初始化很多参数
         private static Thread[] x = new Thread[100000];//线程的数组
         private TimePrinter[] time = new TimePrinter[100000];//这个类实现了implements Runnable 
          private static Hashtable table = new Hashtable(); //每一个线程名 都有一个唯一的标志号
         int[] j = new int[100000]; //线程的标志号 初始
                //在init方法初始
         for (int i = 0; i < 100000; i++) {
j[i] = 0;//等于0表示没有使用 等于1表示正在使用
}
         每次战斗发生的时候 我都会建立一个线程名字(是唯一的  是两个人战斗的ID组成的) 这个时候我会从 标志号里找一个等于0,把这两个号放到Hashtable中.
        中间还有一些简单的操作 就不说了
        在我x[].start()的时候 经常出现错误 
        错误的提示是java.lang.IllegalThreadStateException这个错误 这个错误的解释就是对死亡的线程进行start()等操作
      我就在线程start()前判断一下x[in].isAlive() 判断一下线程的状态 只有true的时候才start
     但是还有问题
     这是我第一次用线程的东西 不知道这么做对不对
     如果不对,希望各位高手给一种好办法,我也不知道真正的游戏里的战斗是怎么做的 还有最后我说的那个问题java.lang.IllegalThreadStateException应该如果解决
     先谢谢各位高手了
  

解决方案 »

  1.   

    线程是用来处理同时发生的事情的,你如果做的是网络游戏我想才会把每场战斗作为线程来处理,如果是单机,放在主线程里就可以了,毕竟不会同时发生多场战斗吧IllegalThreadStateException说明你start了一个已经结束的线程,已经结束的线程应该取得你需要的运行结果后就抛弃掉,不要再保留引用了。我的一点想法
      

  2.   

    不是单机的游戏 会发生多场战斗的 那你能告诉我如何判断线程是否死亡 
    我是用if(!x[in].isAlive()){
    x[in].start();
    }解决的 但是不行
      

  3.   

    线程结束之前,线程自己把自己从那个数组中remove,这样就不会还保有对它的引用了
      

  4.   

    如果你要主线程来控制,也可以在线程对象在加一个标志,标志这个线程是不是已经运行过了,线程结束的时候把这个标志设为true,主线程判断这个标志就可以了。
      

  5.   

    你说的是哪个数组 线程结束后 我会清除hashtable和数组的 你所说的标志我早就有了
      

  6.   

    你可以看看corejava里说线程的那篇..
    java自己带了很多现成的线程工具类的.
    在java.util.concurrent下面有很多,许多用现成的就可以....