多线程不停执行if判断,即便if条件正确也不执行(判断的是另一个类的公共静态变量),在线程run方法最前面加一句输出print语句却又执行了,求解…… 你判断的是Tank.IS_FIREING和 Tank.FIRE_READY这个没实例化能传递数据?应该用playerTank.IS_FIREING和playerTank.FIRE_READY吧! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你在输出的地方 把 这个的值 都输出来看看Tank.IS_FIREING == true && Tank.FIRE_READY ==true 是这样的,输出值全部正确,但是如果去掉输出语句,却根本不执行run方法。我试了一下,if之前加sleep(0)也正常,总之就是目前版本这个线程的run方法的if语句压根不执行,加输出语句或sleep(0)在前面就好了 是这样的,输出值全部正确,但是如果去掉输出语句,却根本不执行run方法。我试了一下,if之前加sleep(0)也正常,总之就是目前版本这个线程的run方法的if语句压根不执行,加输出语句或sleep(0)在前面就好了怎么感觉是 线程被别人抢了,你输出或者sleep(0)时 把执行片 给抢回来了 是这样的,输出值全部正确,但是如果去掉输出语句,却根本不执行run方法。我试了一下,if之前加sleep(0)也正常,总之就是目前版本这个线程的run方法的if语句压根不执行,加输出语句或sleep(0)在前面就好了怎么感觉是 线程被别人抢了,你输出或者sleep(0)时 把执行片 给抢回来了调试能够进去if语句,真正运行却不行,难道真的是线程调度问题?………… 是这样的,输出值全部正确,但是如果去掉输出语句,却根本不执行run方法。我试了一下,if之前加sleep(0)也正常,总之就是目前版本这个线程的run方法的if语句压根不执行,加输出语句或sleep(0)在前面就好了怎么感觉是 线程被别人抢了,你输出或者sleep(0)时 把执行片 给抢回来了调试能够进去if语句,真正运行却不行,难道真的是线程调度问题?…………debug 可以,真正运行不行,很大可能是线程调度的差异。 线程调度本来就是不受控的 线程没有靠静态量来传递参数的,都是要class同步,你多看看网上大佬们的线程设计。 在java 中 静态变量 就是常量 这两个是类的静态成员变量,可以用类名直接访问啊一般静态量如果是固定你可以这样取值,但是你这个量不断在改变你怎么保证你的静态量是你所要的值?线程一般都是需要做同步,你这个线程不执行很正常因为取值不正确。首先这里不讨论同步的问题(这个完全可以处理),我的意思是线程执行还是不执行,不会因为取值正不正确而被影响,只是说不正确if语句进不去,而现在的情况是线程启动后无论取值正不正确都进不去,但是加入一些输出语句或是sleep(0)竞争在if之前,就进去了(也就是说明取值判断是正确的,不然进不去)。这是否说明问题的原因不是这个变量而是线程的调度。 这两个是类的静态成员变量,可以用类名直接访问啊一般静态量如果是固定你可以这样取值,但是你这个量不断在改变你怎么保证你的静态量是你所要的值?线程一般都是需要做同步,你这个线程不执行很正常因为取值不正确。首先这里不讨论同步的问题(这个完全可以处理),我的意思是线程执行还是不执行,不会因为取值正不正确而被影响,只是说不正确if语句进不去,而现在的情况是线程启动后无论取值正不正确都进不去,但是加入一些输出语句或是sleep(0)竞争在if之前,就进去了(也就是说明取值判断是正确的,不然进不去)。这是否说明问题的原因不是这个变量而是线程的调度。你的进程不是不执行,如果Tank.IS_FIREING=false的话,你2个if都不会执行,Tank.IS_FIREING内值的刷新要看jvm,可能你print语句触发了Tank.IS_FIREING值的刷新使你后面的if可以执行了,如果你的java程序要考虑jvm ,建议你先去学习jvm。我们学习一种语言应该优先避免外部造成的影响,这里就是因为数据没有同步的关系,你的数据要考jvm自己刷新才能更新,才能正常运行。 这两个是类的静态成员变量,可以用类名直接访问啊一般静态量如果是固定你可以这样取值,但是你这个量不断在改变你怎么保证你的静态量是你所要的值?线程一般都是需要做同步,你这个线程不执行很正常因为取值不正确。首先这里不讨论同步的问题(这个完全可以处理),我的意思是线程执行还是不执行,不会因为取值正不正确而被影响,只是说不正确if语句进不去,而现在的情况是线程启动后无论取值正不正确都进不去,但是加入一些输出语句或是sleep(0)竞争在if之前,就进去了(也就是说明取值判断是正确的,不然进不去)。这是否说明问题的原因不是这个变量而是线程的调度。你的进程不是不执行,如果Tank.IS_FIREING=false的话,你2个if都不会执行,Tank.IS_FIREING内值的刷新要看jvm,可能你print语句触发了Tank.IS_FIREING值的刷新使你后面的if可以执行了,如果你的java程序要考虑jvm ,建议你先去学习jvm。我们学习一种语言应该优先避免外部造成的影响,这里就是因为数据没有同步的关系,你的数据要考jvm自己刷新才能更新,才能正常运行。感谢,好的,看来可能是我问题问早了,这就去同步再看…… 我觉着有没有可能是你线程异步了,还没执行到run这来? 你需要注意Tank类中的属性,Event是一个线程,fireThread是一个线程,两个线程异步对Tank状态进行操作,极有可能出现线程安全问题,建议体系学习java多线程,否则thread会玩到你吐血。(注意多线程同步) 属性前加 volatile,迫使jvm在每次访问前刷新缓存 org.json 测试 1 java与sql junit几个方法的运行先后顺序 java 的异常有几种类型 ?? 如何将一个Frame中的Statement对象传递给另一个? private问题 JDBC中使用带聚合函数出问题 关于awt的问题 在指定的矩形区域中显示字符信息 为啥加入了一行结果完全不同? 有谁知道Java8中关于日期时间Period的ofWeeks和ofMonths的不同。 一道阿里面试题,求高手解答
怎么感觉是 线程被别人抢了,你输出或者sleep(0)时 把执行片 给抢回来了
怎么感觉是 线程被别人抢了,你输出或者sleep(0)时 把执行片 给抢回来了调试能够进去if语句,真正运行却不行,难道真的是线程调度问题?…………
怎么感觉是 线程被别人抢了,你输出或者sleep(0)时 把执行片 给抢回来了调试能够进去if语句,真正运行却不行,难道真的是线程调度问题?…………debug 可以,真正运行不行,很大可能是线程调度的差异。 线程调度本来就是不受控的
感谢,好的,看来可能是我问题问早了,这就去同步再看……