当前位置: 代码迷 >> J2SE >> JFrame关闭后里面的函数为何还在执行
  详细解决方案

JFrame关闭后里面的函数为何还在执行

热度:102   发布时间:2016-04-23 21:26:21.0
JFrame关闭后里面的函数为什么还在执行
程序是socket通信的。接收socket传过来的函数写在对话界面的类里面。
1、关闭对话界面以后读数据的函数仍然在运行,socket连接也没断,关闭方式是setDefaultCloseOperation(DISPOSE_ON_CLOSE)。这跟函数写成while(true){……}有关系么。
2、鉴于上面这点,我打算把程序设计成如果关闭对话界面以后,对方发消息过来,我这边又会重新创建对话界面。我设了变量,用来标识对方发消息过来时我这边是否有界面。如果有界面,创建一个线程来创建对话界面。现在问题是对面发两句我只能显示一句,收是都收到了。我觉得原因是我原来的那个函数在读消息,后来创建的那个对话界面里的函数也在读。请问怎么实现把原来的那个函数停止。

------解决方案--------------------
你先关闭的是对话界面,而没有关闭读取数据的函数....这样是没用的。你可以先切断连接,关闭函数,最后才销毁界面,如果你要接受类似于离线留言之类的信息的话,可以建议你用一个文件来保存所有的离线信息,即你关闭界面之后,数据处理函数接受的信息
------解决方案--------------------
引用:
Quote: 引用:

你先关闭的是对话界面,而没有关闭读取数据的函数....这样是没用的。你可以先切断连接,关闭函数,最后才销毁界面,如果你要接受类似于离线留言之类的信息的话,可以建议你用一个文件来保存所有的离线信息,即你关闭界面之后,数据处理函数接受的信息


为什么整个对象都关闭了里面的函数还在运行,没有释放


while(true)不是运行在JFrame的线程中的吧,你JFrame释放了但是你程序还有其他线程没结束那当然不会彻底停止。
你可以弄一个boolean代表程序是否在运行
比如volatile static boolean running = true;
然后你那个循环写成while(running)
然后你给JFrame添加个Listener,检测到退出时running = false就行了
------解决方案--------------------
setDefaultCloseOperation(EXIT_ON_CLOSE)
------解决方案--------------------

如楼上所说,setDefaultCloseOperation(DISPOSE_ON_CLOSE)只是释放掉UI组件,程序并没有退出。
EXIT_ON_CLOSE 关闭界面的同时会退出当前运行的程序。