gpt4 book ai didi

java - 如何停止等待输入的线程

转载 作者:行者123 更新时间:2023-11-30 06:02:28 25 4
gpt4 key购买 nike

我的程序上有一个监听器线程,它只是等待来自服务器的输入。因此,他收到一条消息,将其放入队列中,然后等待另一条消息。因此,它不能按照其他类似主题中提出的方式来关闭,因为他需要在测试 While 条件之前从服务器接收消息。

这里是:

public class Listener implements Runnable{

private Socket socket;
private ObjectInputStream ois;


public Listener(Socket socket) {
this.socket = socket;
try {
this.ois = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void run() {
try {
while(!socket.isClosed()) {
String type = ois.readUTF();
System.out.println("received: " +type);
main.queue.put(type);
}
} catch (IOException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

所以基本上,当我关闭套接字时,ois.readUTF 将抛出 EOFException。我该怎么做才能正确停止此流而不会出现此异常?

我发现的唯一方法是,当客户端想要停止连接(并关闭套接字)时,他可以向服务器发送一条消息(例如“再见”或其他),然后服务器会回答“再见”,当我的听众收到这个再见时,他将关闭套接字,这将使他退出 while 循环并停止。我认为它应该运作良好。但我想知道是否有另一种方法可以做到这一点(不知何故我对我的想法不太满意)。

最佳答案

最好的方法是使用 NIO API 提供的非阻塞 IO API 。这需要对这段代码进行重大更改。

最简单的方法是在关闭套接字之前设置一些标志isFinishing。然后等待线程应该检查 catch 子句中是否设置了该标志。如果是这种情况,那么它可以安全地忽略 EOFException。如果您采用这种方式,请确保 isFinishing 正确同步(可变同步或更好的 CountDownLatch)。

关于java - 如何停止等待输入的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52001164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com