免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: jerryzhu863
打印 上一主题 下一主题

事件触发不了 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-10-14 20:34 |只看该作者

事件触发不了

刚才的代码有错误
落了.start()
应为
new Thread(){...}.start();

论坛徽章:
0
12 [报告]
发表于 2004-10-15 04:26 |只看该作者

事件触发不了

典型的阻塞问题。

一般来说,普通的程序都会从头执行到尾,但是有些程序使用了“阻塞”模式,如果阻塞事件不被触发,后面的程序不会被执行。

  1. public class MyClass extends Thread{
  2.     public boolean keepRunning;
  3.    
  4.     /** Creates a new instance of MyClass */
  5.     public MyClass() {
  6.         keepRunning = true;
  7.     }
  8.    
  9.     public void run()
  10.     {
  11.         Socket s;
  12.         while(keepRunning)
  13.         {
  14.             s = serversocket.accept();
  15.             //如果没有连接,这里的代码无法被执行
  16.             ....
  17.             ....
  18.         }
  19.     }

  20.     public void stopThread()
  21.     {
  22.         this.keepRunning = false;
  23.     }
  24. }
复制代码


即使你用 myclass.stopThread() , 也不会跳过 serversocket.accept();
正确的方法是彻底破坏阻塞,但是要注意清理资源
应该把serversocket声明成全局变量,然后在stopThread里面调用serversocket.close(),这时会在serversocket.accept()产生一个Exception,然后在finally里面清理掉这个socket。注意,清理不使用的资源非常重要,如果你不能正常清理,有些资源可能会一直被占用,这样你的内存很快就用光,产生OutOfMemory Error而导致程序崩溃的。

  1. public class MyClass extends Thread{
  2.     public boolean keepRunning;
  3.     public Socket serversocket;
  4.    
  5.     /** Creates a new instance of MyClass */
  6.     public MyClass(ServerSocket ssocket) {
  7.         keepRunning = true;
  8.         serversocket = ssocket;
  9.     }
  10.    
  11.     public void run()
  12.     {
  13.         Socket s;
  14.         while(keepRunning)
  15.         {
  16.             try{
  17.                 s = serversocket.accept();
  18.                 //....
  19.                 //.....
  20.             }catch(...){
  21.                 //...
  22.             }finally{
  23.                 //清理资源
  24.             }
  25.         }
  26.     }
  27.    
  28.     public void stopThread()
  29.     {
  30.         try{
  31.             keepRunning = false;
  32.             serversocket.stop();
  33.         }catch(){
  34.             
  35.         }finally{
  36.             
  37.         }
  38.     }
  39. }
复制代码


这个class必须以独立的线程来运行,这样你才可能在这个class运行的时候对其进行干预。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP