我两款游戏用同一套系统,就是逻辑判断不同,就是三国杀那样的
第二款本来好的,后来我把代码复制出来,在别处稍微修改了一下再复制回去就出问题了,怎么clean也不管用
而且这个报错,很人品,同样的行为,有时候报错有时候不报错,而且拿很旧的好的代码复制过去也无效了
错误的形式就是什么都不响应
最终我想到用输出信息来判断卡在哪一步
jou.java里
synchronized(gwait)
{
gwait.wait();
}
//等待玩家操作
System.out.println("玩家操作了");
synchronized(opsecure)
{
opsecure.wakeup=false;
opsecure.wait();//系统内部在计算,不接受玩家再度操作
}
System.out.println("");
gamerOperation.java里
下面这个是玩家操作按键之后
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("AP begins");
//softclick是AI按键,可以忽略,我这个AI没开
if (opseat.lplayertype.lvalue.equals("AI"))
{
if (!softclick)
return ;
softclick=false;//avoid local click
jou.opsecure.wakeup=false;
}
//local表示这个是本地玩家的
if (opseat.lplayertype.lvalue.equals("local"))
{
System.out.println("userclick="+userclick);//多此一举 userclick=true 表示等待的是用户按键
//当用户按键进行处理的,此句始终打印true
if (!userclick)
return;
userclick=false;//这里原来程序是true,我改成false了,貌似不影响
}
if (!this.opseat.isAI)
synchronized (jou.gwait)
{
jou.gwait.notify();
}
else //没开AI,并且isAI都是false 不会走到这里
{
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
System.out.println("{");//这句打印的
while (jou.opsecure.wakeup)
{
//以前这里一直好的,就是唤醒jou.java里的gwait.wait()
//等jou.java里执行到opsecure.wait()的时候,jou.opsecure.wakeup就会=false,表示正在计算一步用户操作,不接受任何其他操作,其他所有人都等待
//1.7里一直好的
//这个循环里没有内容
//然后就是这里一段,上面的一句打印,下面的一句不打印,而且之前好的,没改过这里
}
System.out.println("}"+jou.topscene());//这句就不打印
------解决思路----------------------
这是java jit的问题,
你把jou.opsecure.wakeup声明前面加上volatile