为什么这个线程的实现在没有 运行 方法的情况下也能工作?

Why does this implementation of a thread work without a run method?

我通过一个学校项目收到了一些代码,但我无法理解在这种情况下使用线程的目的。该项目需要使用多线程服务器才能通过。我有以下线程实现,每次新客户端连接时都会创建一个新实例。

问题是他们没有使用 运行-方法,根据我的理解,线程在完成 运行ning 运行-方法时存在。但即使在线程应该完成 运行ning 之后,它仍设法从 propertyStateListener 发送进一步的消息。为什么这有效?这真的算作多线程服务器吗?

每次新客户端连接时启动 ClientHandler 实例:

@Override
public void run() {
    while (true) {
        MessageProducer mp;
        try {
            Socket socket = serverSocket.accept();
            new ClientHandler(socket).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

实际ClientHandler:

private class ClientHandler extends Thread implements PropertyChangeListener {
    private Socket socket;
    private ObjectInputStream ois;
    private ObjectOutputStream oos;
    private Message messagerecieved;

    public ClientHandler(Socket socket) throws IOException {
        this.socket = socket;
        oos = new ObjectOutputStream(socket.getOutputStream());
        ois = new ObjectInputStream(socket.getInputStream());
        messageManager.registerListener(this);
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        messagerecieved = (Message) evt.getNewValue();
        try {
            oos.writeObject(messagerecieved);
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

    }
}

The problem is that they are not using the run-method, in my understanding the thread [exits] when it finishes running the run-method. But even after the thread should have finished running it manages to send further the messages from the propertyStateListener.

你说得对,代码确实令人困惑。他们正在为 ClientHandler 的每个实例创建一个线程,但没有 run() 方法,因此线程在调用 start() 后立即退出。如果 ClientHandler 没有扩展线程,代码实际上仍然有效。

Why does this work

messageManager 线程回调 ClientHandler.propertyChange(...) 方法将结果写回套接字,而不是 ClientHandler 线程。

does this really count as a multi-threaded server?

这里肯定有 2 个线程在工作,因为您有 socket-accept 线程和 messageManager 线程。这是否是“multi-threaded 服务器”取决于我猜的任务。当然,如果每个客户端应该有一个线程,那么这段代码不会那样做。