为什么线程的这种实现在没有run方法的情况下工作



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

问题是他们没有使用run方法,根据我的理解,线程在运行完run方法后就存在了。但是,即使在线程应该已经完成运行之后,它也会设法从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() {
}
}

问题是他们没有使用run方法,据我所知,线程在运行完run方法后会退出。但是,即使在线程应该已经完成运行之后,它也会设法从propertyStateListener进一步发送消息。

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

为什么这能在中工作

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

这真的算多线程服务器吗?

这里肯定有两个线程在工作,因为您有套接字接受线程和messageManager线程。无论这是否是";多线程服务器";我想这取决于任务。当然,如果每个客户端都应该有一个线程,那么这段代码并不能做到这一点。

最新更新