Java客户端-服务端Socket通信调用Thread.sleep后代码冻结如何解决?
问题根因
- 缺少缓冲区刷出操作:你使用
BufferedWriter写入数据时,数据会先暂存在JVM的内存缓冲区中,不会立刻发送到网络。只有当缓冲区被填满、或者主动调用flush()方法、或者关闭流时,数据才会真正发送给客户端。你当前写完数据直接进入休眠,数据一直积压在缓冲区,客户端的BufferedReader.readLine()是阻塞方法,没收到完整的一行数据就会一直等待,表现就是程序像停止运行了一样。 - 休眠时长不符合需求:当前代码里
Thread.sleep(100)是休眠100毫秒,要实现1秒间隔需要改成Thread.sleep(1000)。
修复代码
只需要修改ServerWriter的run方法,在写完数据后加一行bw.flush()即可:
@Override public void run() { int n = 1; boolean active = true; BufferedWriter bw = new BufferedWriter(osw); while(active) { try { bw.write("Server: " + Integer.toString(n)); bw.newLine(); // 新增:手动刷出缓冲区,把数据立刻发送到客户端 bw.flush(); n++; if(n==50) n = 1; // 改成1000实现休眠1秒的需求 try{Thread.sleep(1000);}catch(InterruptedException ex){ex.printStackTrace();} }catch(IOException e) { try { active = false; if(bw != null) bw.close(); }catch(IOException f) {e.printStackTrace();f.printStackTrace();} } } }
补充说明
如果后续需要更高的传输效率,不需要每条消息都实时发送,可以调整缓冲区大小或者攒多条消息再刷出,你当前的场景需要每秒发一条,每次写完刷出是最合适的方案。
内容的提问来源于stack exchange,提问作者sushiwithoutsushi
相关产品推荐
相关产品推荐

