我通過一個學校專案收到了一些代碼,但我無法理解在這種情況下使用執行緒的目的。該專案需要使用多執行緒服務器才能通過。我有以下執行緒實作,每次新客戶端連接時都會創建一個新實體。
問題是他們沒有使用運行方法,據我了解,執行緒在完成運行運行方法時就存在。但即使在執行緒應該完成運行之后,它也會設法從 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() {
}
}
uj5u.com熱心網友回復:
問題是他們沒有使用運行方法,據我了解,當它完成運行運行方法時,執行緒[退出]。但即使在執行緒應該完成運行之后,它也會設法從 propertyStateListener 進一步發送訊息。
您是正確的,代碼肯定會令人困惑。他們正在為每個實體創建一個執行緒,ClientHandler但沒有方法,因此執行緒在被呼叫run()后立即退出。如果不擴展執行緒start(),代碼實際上仍然可以作業。ClientHandler
為什么這行得通
是messageManager執行緒回呼到ClientHandler.propertyChange(...)將結果寫回套接字的方法,而不是ClientHandler執行緒。
這真的算作多執行緒服務器嗎?
這里肯定有 2 個執行緒在作業,因為你有 socket-accept 執行緒和messageManager執行緒。這是否是“多執行緒服務器”取決于我猜的分配。當然,如果每個客戶端都應該有一個執行緒,那么這段代碼就不會這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/433429.html
