You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:27:00