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

Java BufferedReader死锁:如何正确关闭BufferedReader,java,bufferedreader,processbuilder,Java,Bufferedreader,Processbuilder,从InputStreamReader(从InputStream读取)读取的BufferedReader出现死锁问题 有一个Swing GUI正在被用户关闭。JFrame被释放并调用finish方法 DppGUI gui = this; addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent windowEvent) {

InputStreamReader(从InputStream读取)读取的BufferedReader出现死锁问题

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

 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后立即完成)

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

提前谢谢

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

封闭输入流

它来自finish方法。这意味着InputStreamReader和BufferedReader未关闭。

更换

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

  • 当您围绕inputstream/reader创建包装器时,对包装器执行关闭操作会对包装对象执行关闭操作。因此,您不需要所有这些
    close
    调用

  • 我建议您停止自动关闭流的进程,并从
    reader.readLine
    收到
    null


  • 中断正在进行读取的线程。1。我就是这么想的。谢谢你的信息。2.成功了!我将进程(从中获取InputStream)放入一个字段中,并使用process.destroy()方法。它立即离开while循环,让线程结束。
        while (_isRunning)
        {
            while ((line = _reader.readLine()) != null) // The program deadlocks in this line when the GUI is closed
            {
    
        while (_isRunning && (line = _reader.readLine()) != null)
        {