Java线程未按预期启动/工作

Java线程未按预期启动/工作,java,multithreading,sockets,networking,Java,Multithreading,Sockets,Networking,我正在实现一个简单的客户机-服务器体系结构,其中多个客户机应该能够连接到服务器,并且可以在服务器和客户机之间交换字符串 我的想法是,每边都有两个线程:一个侦听器,不断检查inputstream中是否有新的内容;另一个编写器线程,如果有内容要写,则写入套接字 但是,第二个线程甚至没有启动。。。仅显示第一个sysout //start new thread to handle client input new Thread( new ServerWorker(

我正在实现一个简单的客户机-服务器体系结构,其中多个客户机应该能够连接到服务器,并且可以在服务器和客户机之间交换字符串

我的想法是,每边都有两个线程:一个侦听器,不断检查inputstream中是否有新的内容;另一个编写器线程,如果有内容要写,则写入套接字

但是,第二个线程甚至没有启动。。。仅显示第一个sysout

    //start new thread to handle client input
    new Thread(
            new ServerWorker(clientSocket, this, this.getIdCounter())).start();
    System.out.println("server side listener started");

    //start new thread to handle client output
    new Thread(new ServerWorkerListener(clientSocket)).start();
    System.out.println("server side writer started");
以下是来自ServerWorker的一些代码:

public void run() {
    try {
        OutputStream output = clientSocket.getOutputStream();
        while (true) {
            // output.write(("Pling!\n\n").getBytes());

            for (Client tempClient : server.getClientList()) {
                if ((tempClient.getId() == this.id)
                        && tempClient.isShouldSend()) {

                    output.write((tempClient.getOutputStream() + "\n\n")
                            .getBytes());
                    tempClient.setInputStream("");
                    tempClient.setShouldSend(false);
                }
            }

        }
    } catch (IOException e) {
        System.out.println("Error in serverWorker");
        e.printStackTrace();
    }

}
我真的不知道我错过了什么

整个服务器工作人员: 公共类ServerWorker实现可运行{

protected Socket clientSocket = null;
protected String serverText = null;
protected int id;
protected Server server;

public ServerWorker(Socket clientSocket, Server server,
        int id) {
    this.clientSocket = clientSocket;
    this.serverText = serverText;
    this.id = id;
    this.server = server;
}

public void run() {
    try {
        OutputStream output = clientSocket.getOutputStream();
        while (true) {
            // output.write(("Pling!\n\n").getBytes());

            for (Client tempClient : server.getClientList()) {
                if ((tempClient.getId() == this.id)
                        && tempClient.isShouldSend()) {

                    output.write((tempClient.getOutputStream() + "\n\n")
                            .getBytes());
                    tempClient.setInputStream("");
                    tempClient.setShouldSend(false);
                }
            }

        }
    } catch (IOException e) {
        System.out.println("Error in serverWorker");
        e.printStackTrace();
    }

}
}

整个ServerWorkerListener:

    public class ServerWorkerListener implements Runnable {

private BufferedReader input;
private Socket clientSocket;

public ServerWorkerListener(Socket clientSocket) {
    this.clientSocket = clientSocket;
    run();
}

@Override
public void run() {
    System.out.println("its running");
    try {

        BufferedReader in = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));

        while (true) {
            System.out.println("it's looping");
            String inputLine = null;
            if ((inputLine = in.readLine()) != null) {
                JOptionPane.showMessageDialog(null, inputLine, "InfoBox: "
                        + "Message from client",
                        JOptionPane.INFORMATION_MESSAGE);

            }
        }

    } catch (UnknownHostException e) {
        System.err.println("Don't know about client");
        System.exit(1);
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection to client");
        System.exit(1);

    }
}

}

您正在调用ServerWorkerListener的构造函数内部的run,您不能这样做。新线程应该调用run,否则,由于它包含一个无限循环,它将永远不会从构造函数返回,因此永远不会调用线程的构造函数,更不用说它的start方法了。因此,从构造函数中删除run调用应该可以解决问题。

ServerWorkerListener的构造函数中是否有任何阻塞代码?能否发布整个ServerWorker和ServerWorkerListener类的源代码?已更新,感谢您的关注!不能在ServerWorkerListener的构造函数内调用run。新线程应该调用run,否则,由于它包含一个无限循环,它将永远不会从构造函数返回,因此永远不会调用线程的构造函数,更不用说它的start方法了。是的!这就是答案。我怎么接受呢?非常感谢你。。。