一个很怪异的问题

树成 2008-12-25 03:57:04
现在我的需求是要实现一个类似侦听器的功能,java要实现这一的功能肯定要死循环来做。
我启动一个线程用作监听功能并且是死循环,线程代码如下

protected void addCardLisenter(ReadCardLisenter readcardlisenter){
this.startcount+=1;
Common.logger("读卡系统初始化:"+this.startcount+"\r\n");
cardexecute=new CardExecute(readcardlisenter);
Thread t=new Thread(cardexecute);
t.start();
}

swing界面加载的时候调用这个方法,这个监听线程正常运行没有任何问题。
但是这个监听线程在运行一段时间后就会突然停掉,这通常发生在一般在有人使用并触发的时候,发生现象是用户在使用的过程中突然界面卡死掉并且不能再做操作,这种现象发生几率并不高,但是总有发生,并且卡死过程中未抛出任何异常与程序错误(整段代码都被用try catch(Exception e)控制起来,不可能看不到异常抛出)。
...全文
184 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Iangao 2008-12-25
  • 打赏
  • 举报
回复
你的CardExecute里应该是监听JNI地响应吧,看看JNI里有没有内存泄露地问题.
talent_marquis 2008-12-25
  • 打赏
  • 举报
回复
你试试在你的死循环里执行完逻辑操作后面加上一句System.gc();通知系统回收垃圾一次。

看看能不能减少出现问题的几率。

如果可以,那可能就是内存溢出了。
gongfuliang 2008-12-25
  • 打赏
  • 举报
回复
那就是了,那么这些new的对象是不是有机会被释放呢?

如果没有机会释放的话,那就是典型的OutOfMemory
树成 2008-12-25
  • 打赏
  • 举报
回复
请恕代码不能过多公开,毕竟这牵扯到某些利益问题。
可以告诉你,循环内部是存在很多new对象的操作,不过这是不可避免的,但是只有在触发操作时才有new对象操作。
gongfuliang 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 spiniper 的回复:]
引用 6 楼 talent_marquis 的回复:
如果是这样的话,那么我怀疑
这个CardExecute类在执行的时候,某些情况下会占用系统的全部资源导致死锁了

如果是死锁的话,可能性应该不大,因为死锁是一种逻辑设计错误,它是会平凡发生的,而且应该是在特定条件下发生。
现在的死线程问题是毫无征兆的,切发生记录极低,现在总共有十余台机器在共同使用此程序且每天使用量达千余次,只是一个星期内有某一至两台机器发生这种情况,…
[/Quote]

看看你的下面这两个是怎么实现的,是不是会一直申请内存空间?

cardexecute=new CardExecute(readcardlisenter);
Thread t=new Thread(cardexecute);
树成 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 talent_marquis 的回复:]
如果是这样的话,那么我怀疑
这个CardExecute类在执行的时候,某些情况下会占用系统的全部资源导致死锁了
[/Quote]
如果是死锁的话,可能性应该不大,因为死锁是一种逻辑设计错误,它是会平凡发生的,而且应该是在特定条件下发生。
现在的死线程问题是毫无征兆的,切发生记录极低,现在总共有十余台机器在共同使用此程序且每天使用量达千余次,只是一个星期内有某一至两台机器发生这种情况,虽然不是大问题,但是作为客户还是无法忍受的。
gongfuliang 2008-12-25
  • 打赏
  • 举报
回复
会不会OutOfMemory啊?

没见过你里面是怎么处理的,如果说只在有操作的时候,而且是个死循环,那么就有可能啊
hbwhwang 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 talent_marquis 的回复:]
如果是这样的话,那么我怀疑
这个CardExecute类在执行的时候,某些情况下会占用系统的全部资源导致死锁了
[/Quote]

嗯,同疑
zhentuxiaohao163 2008-12-25
  • 打赏
  • 举报
回复
真怪异啊!!!
talent_marquis 2008-12-25
  • 打赏
  • 举报
回复
如果是这样的话,那么我怀疑
这个CardExecute类在执行的时候,某些情况下会占用系统的全部资源导致死锁了
树成 2008-12-25
  • 打赏
  • 举报
回复
首先我的addCardLisenter 方法只调用一次,所以不可能无限new线程出来
还有cardexecute里面是一个死循环,线程一直在不断执行,所以我也不太清楚它是否会被销毁,但是我想虚拟机应该不会销毁它,它不是闲置对象,只是没有引用而已。
believefym 2008-12-25
  • 打赏
  • 举报
回复
死锁了?
xuhua205 2008-12-25
  • 打赏
  • 举报
回复
呵 ,第一次见! 学习
talent_marquis 2008-12-25
  • 打赏
  • 举报
回复
会不会是你new的线程太多了?
这个监听器每触发一次就会new一个新线程来处理cardexecute事件
那么cardexecute事件处理完以后,线程是否销毁了?
MT502 2008-12-25
  • 打赏
  • 举报
回复
用catch(Throwable t)试试呢

62,614

社区成员

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

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