【发布时间】:2018-02-04 01:18:11
【问题描述】:
我已经实现了一个简单的聊天应用程序,它接收消息并将它们重定向给所有用户,因为我正在学习并行编程。
客户端有两个线程:一个用于监听服务器,另一个(主线程)用于写入服务器。
这些是用来实现这个的代码:
主线程:
try {
Thread listener = new Thread(new Receiver(in));
listener.start();
while (listener.isAlive()) {
out.println(stdIn.readLine());
}
out.close();
in.close();
clientSocket.close();
} catch (IOException e) {
System.err.println("Error trying to send text to server" + e.getMessage());
}
第二个线程可运行:
public class Receiver implements Runnable {
private BufferedReader in;
public Receiver(BufferedReader serverInput) {
this.in = serverInput;
}
@Override
public void run() {
String responseLine;
try {
while ((responseLine = in.readLine()) != null) {
System.out.println(responseLine);
if (responseLine.contains("Bye")) break;
}
} catch (IOException e) {
System.err.println("Erro ao receber mensagem do servidor: " + e.getMessage());
}
}
}
客户端应该发送一条消息 (#quit) 以退出聊天,服务器将回复一条消息 (Bye) 以完成客户端应用程序。
接收线程停止生命周期后如何停止主线程?
我使用isAlive() 方法来完成它,但是在用户发送#quit 消息后,线程仍然处于活动状态,它再次落在stdIn.readline() 上,这会中断线程直到用户发送另一条消息,即使他已经断开连接。
我尝试实现另一个线程(称为发件人)向服务器发送消息,并在主线程上使用listener.join() 用Thread.interrupt() 中断发件人线程,但发件人线程仍然落在stdIn.readline() 方法和我不知道如何正确中断 IO。
如果有人想阅读完整的代码,请访问github page。
【问题讨论】:
标签: java multithreading concurrency