你判断的是Tank.IS_FIREING和 Tank.FIRE_READY这个没实例化能传递数据?应该用playerTank.IS_FIREING和playerTank.FIRE_READY吧!

解决方案 »

  1.   

    你在输出的地方 把  这个的值 都输出来看看Tank.IS_FIREING == true && Tank.FIRE_READY ==true
      

  2.   

    是这样的,输出值全部正确,但是如果去掉输出语句,却根本不执行run方法。我试了一下,if之前加sleep(0)也正常,总之就是目前版本这个线程的run方法的if语句压根不执行,加输出语句或sleep(0)在前面就好了
      

  3.   

    是这样的,输出值全部正确,但是如果去掉输出语句,却根本不执行run方法。我试了一下,if之前加sleep(0)也正常,总之就是目前版本这个线程的run方法的if语句压根不执行,加输出语句或sleep(0)在前面就好了
    怎么感觉是 线程被别人抢了,你输出或者sleep(0)时  把执行片 给抢回来了
      

  4.   

    是这样的,输出值全部正确,但是如果去掉输出语句,却根本不执行run方法。我试了一下,if之前加sleep(0)也正常,总之就是目前版本这个线程的run方法的if语句压根不执行,加输出语句或sleep(0)在前面就好了
    怎么感觉是 线程被别人抢了,你输出或者sleep(0)时  把执行片 给抢回来了调试能够进去if语句,真正运行却不行,难道真的是线程调度问题?…………
      

  5.   

    是这样的,输出值全部正确,但是如果去掉输出语句,却根本不执行run方法。我试了一下,if之前加sleep(0)也正常,总之就是目前版本这个线程的run方法的if语句压根不执行,加输出语句或sleep(0)在前面就好了
    怎么感觉是 线程被别人抢了,你输出或者sleep(0)时  把执行片 给抢回来了调试能够进去if语句,真正运行却不行,难道真的是线程调度问题?…………debug 可以,真正运行不行,很大可能是线程调度的差异。 线程调度本来就是不受控的
      

  6.   

    线程没有靠静态量来传递参数的,都是要class同步,你多看看网上大佬们的线程设计。
      

  7.   

    在java 中 静态变量 就是常量
      

  8.   

    这两个是类的静态成员变量,可以用类名直接访问啊一般静态量如果是固定你可以这样取值,但是你这个量不断在改变你怎么保证你的静态量是你所要的值?线程一般都是需要做同步,你这个线程不执行很正常因为取值不正确。首先这里不讨论同步的问题(这个完全可以处理),我的意思是线程执行还是不执行,不会因为取值正不正确而被影响,只是说不正确if语句进不去,而现在的情况是线程启动后无论取值正不正确都进不去,但是加入一些输出语句或是sleep(0)竞争在if之前,就进去了(也就是说明取值判断是正确的,不然进不去)。这是否说明问题的原因不是这个变量而是线程的调度。
      

  9.   

    这两个是类的静态成员变量,可以用类名直接访问啊一般静态量如果是固定你可以这样取值,但是你这个量不断在改变你怎么保证你的静态量是你所要的值?线程一般都是需要做同步,你这个线程不执行很正常因为取值不正确。首先这里不讨论同步的问题(这个完全可以处理),我的意思是线程执行还是不执行,不会因为取值正不正确而被影响,只是说不正确if语句进不去,而现在的情况是线程启动后无论取值正不正确都进不去,但是加入一些输出语句或是sleep(0)竞争在if之前,就进去了(也就是说明取值判断是正确的,不然进不去)。这是否说明问题的原因不是这个变量而是线程的调度。你的进程不是不执行,如果Tank.IS_FIREING=false的话,你2个if都不会执行,Tank.IS_FIREING内值的刷新要看jvm,可能你print语句触发了Tank.IS_FIREING值的刷新使你后面的if可以执行了,如果你的java程序要考虑jvm ,建议你先去学习jvm。我们学习一种语言应该优先避免外部造成的影响,这里就是因为数据没有同步的关系,你的数据要考jvm自己刷新才能更新,才能正常运行。
      

  10.   

    这两个是类的静态成员变量,可以用类名直接访问啊一般静态量如果是固定你可以这样取值,但是你这个量不断在改变你怎么保证你的静态量是你所要的值?线程一般都是需要做同步,你这个线程不执行很正常因为取值不正确。首先这里不讨论同步的问题(这个完全可以处理),我的意思是线程执行还是不执行,不会因为取值正不正确而被影响,只是说不正确if语句进不去,而现在的情况是线程启动后无论取值正不正确都进不去,但是加入一些输出语句或是sleep(0)竞争在if之前,就进去了(也就是说明取值判断是正确的,不然进不去)。这是否说明问题的原因不是这个变量而是线程的调度。你的进程不是不执行,如果Tank.IS_FIREING=false的话,你2个if都不会执行,Tank.IS_FIREING内值的刷新要看jvm,可能你print语句触发了Tank.IS_FIREING值的刷新使你后面的if可以执行了,如果你的java程序要考虑jvm ,建议你先去学习jvm。我们学习一种语言应该优先避免外部造成的影响,这里就是因为数据没有同步的关系,你的数据要考jvm自己刷新才能更新,才能正常运行。
    感谢,好的,看来可能是我问题问早了,这就去同步再看……
      

  11.   

    我觉着有没有可能是你线程异步了,还没执行到run这来?
      

  12.   

    你需要注意Tank类中的属性,Event是一个线程,fireThread是一个线程,两个线程异步对Tank状态进行操作,极有可能出现线程安全问题,建议体系学习java多线程,否则thread会玩到你吐血。(注意多线程同步)
      

  13.   

    属性前加 volatile,迫使jvm在每次访问前刷新缓存