【问题标题】:BufferedReader Deadlock: How to properly shutdown a BufferedReaderBufferedReader 死锁:如何正确关闭 BufferedReader
【发布时间】:2019-01-27 13:48:12
【问题描述】:

我的 BufferedReader 存在 死锁 问题,该问题从 InputStreamReader 读取(从 InputStream 读取)。

有一个 Swing GUI 正在被用户关闭。正在处理 JFrame,并调用了一个完成方法。

 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循环,最终让线程完成。这里是finish方法。

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 以便行

while ((line = _reader.readLine()) != null)

被跳过。

这是死锁的线程(它需要在用户关闭 gui 后立即结束)。

@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 没有关闭。

【问题讨论】:

  • 中断正在读取的线程。

标签: java bufferedreader processbuilder


【解决方案1】:
  1. 当您围绕输入流/读取器创建包装器时 - 对包装器执行关闭操作会关闭被包装的对象。所以你不需要所有那些close 电话。

  2. 我建议您停止自动关闭流的进程,您会收到来自reader.readLinenull

【讨论】:

  • 1.那正是我所想。谢谢(你的)信息。 2. 成功了!我将流程(从中获取 InputStream)放入一个字段并使用 process.destroy() 方法。它立即离开 while 循环并让线程完成。
【解决方案2】:

替换

    while (_isRunning)
    {
        while ((line = _reader.readLine()) != null) // The program deadlocks in this line when the GUI is closed
        {

    while (_isRunning && (line = _reader.readLine()) != null)
    {

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 2012-01-02
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多