首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferedReader死锁:如何正确关闭BufferedReader

BufferedReader死锁:如何正确关闭BufferedReader
EN

Stack Overflow用户
提问于 2018-08-21 11:19:49
回答 2查看 322关注 0票数 0

我的BufferedReaderInputStreamReader (从InputStream读取)遇到了死锁问题。

有一个Swing GUI正在被用户关闭。正在释放JFrame并调用finish方法。

代码语言:javascript
复制
 DppGUI gui = this;
 addWindowListener(new WindowAdapter()
    {
        @Override
        public void windowClosing(WindowEvent windowEvent)
        {
            int choice = Dialogs.displayExitQuestionDialog(gui);
            if (choice == JOptionPane.YES_OPTION)
            {
                _dataReciever.finish();
                dispose();
            }
        }
    });

需要运行finish方法才能中断while循环,从而最终让线程完成。这是完成的方法。

代码语言:javascript
复制
public void finish()
{
    _isRunning = false; // This boolean shall break a while loop.
    _listener = null;
    try
    {
        _processInputStream.close();
        System.out.println("Closed input stream");

        _inputStreamReader.close();
        System.out.println("Closed input stream reader");

        _reader.close();
        System.out.println("Closed reader");
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

问题是,我不知道如何从“外部”关闭BufferedReader,从而使行

代码语言:javascript
复制
while ((line = _reader.readLine()) != null)

被跳过了。

下面是死锁的线程(一旦用户关闭gui,它就需要完成)。

代码语言:javascript
复制
@Override
public void run()
{
    _isRunning = true;
    CommandManager commandManager = new CommandManager();
    Process process = null;
    try
    {
        process = commandManager.makeCommand(MqttCoammands.MOSQUITTO_SUB,
                "HFC_001", "");
        System.out.println("Mosquitto Sub Command generated.");
        _processInputStream = process.getInputStream();
        _inputStreamReader = new InputStreamReader(_processInputStream);
        _reader = new BufferedReader(_inputStreamReader);

        String line = null;
        while (_isRunning)
        {
            while ((line = _reader.readLine()) != null) // The program deadlocks in this line when the GUI is closed
            {
                String[] splits = line.split(";");
                _parameterList = Arrays.asList(splits);
                System.out.println(_parameterList.toString());
                _listener.get(_parameterList);
            }
        }
        System.out.println("Left the While loop. Preparing end of Thread.");
        _listener = null;
        //            finish();
    }
    catch (IllegalCommandException e1)
    {
        e1.printStackTrace();
    }
    catch (UnsupportedOperatingSystemException e1)
    {
        e1.printStackTrace();
    }
    catch (IOException e1)
    {
        e1.printStackTrace();
    }
}

要关闭BufferedReader,我尝试将其设置为null。我试图关闭BufferedReader、InputStreamReader和InputStream (正如您在finish方法中看到的那样),但是没有工作,程序仍然死锁。有人遇到过同样的问题吗?有人看到解决办法了吗?

提前感谢!

编辑:--我忘记提到死锁之前的最后一个控制台输出是

封闭输入流

它来自于完成方法。这意味着InputStreamReader和BufferedReader并不是封闭的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-21 11:38:26

  1. 当您围绕输入流/读取器创建包装器时--对包装器执行关闭操作,则对包装对象执行关闭操作。因此,您不需要所有这些close调用。
  2. 我建议您停止自动关闭流的进程,然后从reader.readLine接收一个reader.readLine
票数 0
EN

Stack Overflow用户

发布于 2018-08-21 11:25:21

替换

代码语言:javascript
复制
    while (_isRunning)
    {
        while ((line = _reader.readLine()) != null) // The program deadlocks in this line when the GUI is closed
        {

使用

代码语言:javascript
复制
    while (_isRunning && (line = _reader.readLine()) != null)
    {
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51947546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档