当前位置: 代码迷 >> J2SE >> 线程卡死有关问题
  详细解决方案

线程卡死有关问题

热度:18   发布时间:2016-04-23 19:53:24.0
线程卡死问题
我两款游戏用同一套系统,就是逻辑判断不同,就是三国杀那样的

第二款本来好的,后来我把代码复制出来,在别处稍微修改了一下再复制回去就出问题了,怎么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
  相关解决方案