论坛首页 编程语言技术论坛

主动式关闭-线程,ServerSocket堵塞关闭的一个法子

浏览 6980 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-30  
385104182 写道
sziitjiang 写道
385104182 写道
顶楼主,顺便问一下,如果是
public void run() {
  while (true) {
     String responsecode = reader.readLine();
  }
}
流的等待读取阻塞的情况该怎么办

还有你这个是在不断读取,并没有堵塞,只是在不断循环而已!你可以打印一下responsecode看看

另一端不写数据,这边等待读的时候就是阻塞啊

呵呵,对哦,那你干嘛要这样子做捏?要不你用responsecode里面的内容来判断关闭,比如另一端发过来 "break"
public void run() {
  while (true) {
     String responsecode = reader.readLine();
     if("break".equals(responsecode)){
         break;
     }
  }
}

然后另一端一写数据,这端就接收到了,于是乎,循环停止,这个也符合自动式关闭理念,哈哈,看起来我很像在扯淡,我也觉得,哈哈!
0 请登录后投票
   发表时间:2012-10-31  
sziitjiang 写道
jxxjee 写道
个人觉得这种关闭线程的方法很不好,为何不修改为
public void stopThread(){  
        this.flag = false;  
        this.interrupt();
    }


public void stopThread(){  
        this.flag = false;  
        serverSocket.close();
    }


public void stopThread(){  
        this.flag = false;  
        pool.notify();  
    }  



我觉得就是用interrupt方法会马上中断线程,在多线程访问的时候,可能会导致数据不同步问题,或者说,线程正在执行得起劲,在努力帮你干活呢,你却中途把它给干掉了,那它真实死不瞑目了,主动式关闭就是让它把工作干完,然后安心死去,哈哈!

还有
public void stopThread(){  
        this.flag = false;  
        pool.notify();  
    }  

这个代码,notify确实是将线程唤醒了,不过pool里面为空,那后面那行代码
 obj = pool.remove(0);  

就抛出空指针异常了!
我认为是这样


第一个问题,我觉得编写网络IO程序时本来就需要考虑网络闪断的问题,网络闪断与这里自己interrupt需要做的收尾处理工作基本一样,所以如果想线程立即结束的话主动interrupt也没有太大问题

第二个问题,只是因为要避免一个空指针就往pool里add一个空串,这个处理我觉得很不妥,别人看到这个代码会怎么理解,从pool里取到obj是否还需要notEmpty判断,等等。换个角度来看,安全地尝试从pool里取出第一个元素,并进行一下非空判断也不是多复杂的事。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics