【问题标题】:How to stop a Thread waiting for input如何停止等待输入的线程
【发布时间】:2018-08-24 09:14:29
【问题描述】:

我的程序上有一个侦听器线程,它正在等待来自服务器的输入。因此,他收到一条消息,将其放入队列中,然后等待另一个消息。因为这个事实,在其他类似主题中提出的方式上不能关闭它,因为他需要在测试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 循环并停止。我认为它应该运作良好。但我想知道是否有其他方法可以做到这一点(不知何故,我对我的想法不太满意)。

【问题讨论】:

  • 中断线程和/或关闭连接。
  • 你读过这篇文章吗?问题正是如何做到这一点,知道 ois.read 在获得输入之前一直处于阻塞状态。所以关闭连接只会让他抛出 EOFException。
  • 这正是它应该做的。然后它将不再阻塞读取。我读了你的帖子,但你显然不明白我给你的帮助。
  • 问题是“我可以做些什么来正确地停止这个流没有得到这个异常?”。以为很清楚。
  • 但你只是认为这很糟糕,因为有一个例外。我告诉你,这样做是完全正常的。您说的是“正确”,这意味着这不是正确的方法。我告诉你,你错了。

标签: java multithreading sockets


【解决方案1】:

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

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

【讨论】:

  • 嗯,好吧...我不认为我可以使用 NIO API,我真的需要一个 ObjectInputStream 这里我不知道这将如何与 nio 一起工作(遗憾的是没有时间学习它)。我也想过抓旗,但我仍然更喜欢我的解决方案。我想我会坚持我的想法。
  • 它不像阻塞API那么简单但是你can useObjectInputStream
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
相关资源
最近更新 更多