线程卡死问题

walkuere 2015-03-29 01:25:05
我两款游戏用同一套系统,就是逻辑判断不同,就是三国杀那样的

第二款本来好的,后来我把代码复制出来,在别处稍微修改了一下再复制回去就出问题了,怎么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());//这句就不打印

...全文
320 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wapigzhu 2015-04-06
  • 打赏
  • 举报
回复
这是java jit的问题, 你把jou.opsecure.wakeup声明前面加上volatile
walkuere 2015-04-06
  • 打赏
  • 举报
回复
引用 4 楼 letingoo 的回复:
lz你的代码风格有待提高啊
还是希望有人能指教啊
walkuere 2015-04-06
  • 打赏
  • 举报
回复
引用 4 楼 letingoo 的回复:
lz你的代码风格有待提高啊
哎我也是闭门造车瞎学的
letingoo 2015-04-05
  • 打赏
  • 举报
回复
lz你的代码风格有待提高啊
walkuere 2015-03-29
  • 打赏
  • 举报
回复
好了,这40分送人,尤其是那些努力回答别人问题的大牛
walkuere 2015-03-29
  • 打赏
  • 举报
回复
后来我为了效率,在里面加; 还是会死 加 if (true) ;还是会死 只有加了 System.out.print("")才好 这什么世道! 估计是1.8的优化?
walkuere 2015-03-29
  • 打赏
  • 举报
回复
神奇了,我在while (jou.opsecure.wakeup){}里写了个打印信息,每次就打印一次,然后调试就一直好的从不出问题 之前短的两步,长的七八步就出问题 我就是懒得在while (jou.opsecure.wakeup){}里再加个唤醒线程罢了

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧