线程睡眠冻结了我的代码。 Java 客户端-服务器通信

Posted

技术标签:

【中文标题】线程睡眠冻结了我的代码。 Java 客户端-服务器通信【英文标题】:Thread sleep is freezing my code. Java client-Server communication 【发布时间】:2021-12-10 08:59:38 【问题描述】:

我编写了一个程序,可以在两台计算机之间创建与套接字的通信。目前该程序使服务器向客户端发送从 1 到 50 的数字。

当我运行这个程序时,通过控制台的输出看起来太快了,所以我想让消息发送者线程休眠一秒钟。但是,当我编写 try catch 以使线程休眠时,整个程序都会停止。我做错了什么?

服务器端:

public class ControladorClientes extends Thread
    public Socket s;
    private OutputStreamWriter osw;
    public InputStreamReader isr;
            
    public ControladorClientes(Socket s) 
        try 
            this.s = s;
            this.osw = new OutputStreamWriter(s.getOutputStream());
            this.isr = new InputStreamReader(s.getInputStream());
            
        catch(IOException e) 
                e.printStackTrace();
        
    
    
    @Override
    public void run() 
        Thread tWriter = new ServerWriter(osw);
        tWriter.start();

    

服务器编写器:

public class ServerWriter extends Thread
    OutputStreamWriter osw;
    
    public ServerWriter(OutputStreamWriter osw) 
        this.osw = osw;
    
        
    @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();
                n++;
                if(n==50) n = 1;
                tryThread.sleep(100);catch(InterruptedException ex)ex.printStackTrace();;
            catch(IOException e) 
                try 
                    active = false;
                    if(bw != null) bw.close();
                catch(IOException f) e.printStackTrace();f.printStackTrace();
                       
        
    

客户:

import java.io.*;
import java.net.*;

public class SimpleClient 
    public static void main(String[] args)
        try 
            Socket s = new Socket("localhost", 5555);
            
            InputStreamReader isr = new InputStreamReader(s.getInputStream());
            Thread tReader = new ClientReader(isr);
            tReader.start();
        catch(IOException e) e.printStackTrace();
    

还有 ClientReader:


import java.io.*;
import java.net.*;

public class ClientReader extends Thread 
    InputStreamReader isr;
    public ClientReader(InputStreamReader isr) 
        this.isr = isr;
    
    
    @Override
    public void run() 
        BufferedReader br = new BufferedReader(isr);
        while(true) 
            try 
                String msg = br.readLine();
                System.out.println(msg);
             catch (IOException e) e.printStackTrace();break;
        
    

【问题讨论】:

【参考方案1】:

添加bw.flus() 似乎解决了我所有的问题。

【讨论】:

以上是关于线程睡眠冻结了我的代码。 Java 客户端-服务器通信的主要内容,如果未能解决你的问题,请参考以下文章

线程中的 sleep() 也会导致 main 睡眠

主线程冻结所有其他线程,包括 java gui 线程

睡眠功能使用服务器资源?

如何阻止我的 UI 冻结?

网络工作者睡眠

创建一个线程使函数休眠而不冻结程序