精华帖 (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; } } } 然后另一端一写数据,这端就接收到了,于是乎,循环停止,这个也符合自动式关闭理念,哈哈,看起来我很像在扯淡,我也觉得,哈哈! |
|
返回顶楼 | |
发表时间: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里取出第一个元素,并进行一下非空判断也不是多复杂的事。 |
|
返回顶楼 | |