BufferedReader 死锁:如何正确关闭 BufferedReader
BufferedReader Deadlock: How to properly shutdown a BufferedReader
我有一个 死锁 问题与 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 循环以最终让线程完成。这是完成方法。
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();
}
}
问题是我无法弄清楚如何从 "outside" 关闭 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,我尝试将其设置为空。我尝试关闭 BufferedReader、InputStreamReader 和 InputStream(如您在 finish 方法中所见),但没有任何效果,程序仍然死锁。有人遇到过同样的问题吗?有人看到解决方案了吗?
提前致谢!
编辑:
忘了说死锁前最后的控制台输出是
closed input stream
来自finish方法。这意味着 InputStreamReader 和 BufferedReader 没有被关闭。
替换
while (_isRunning)
{
while ((line = _reader.readLine()) != null) // The program deadlocks in this line when the GUI is closed
{
和
while (_isRunning && (line = _reader.readLine()) != null)
{
当您围绕 inputstream/reader 创建包装器时 - 对包装器执行关闭操作会关闭被包装的对象。所以你不需要所有那些 close
调用。
我建议您停止自动关闭流的进程,您会收到来自 reader.readLine
的 null
。
我有一个 死锁 问题与 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 循环以最终让线程完成。这是完成方法。
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();
}
}
问题是我无法弄清楚如何从 "outside" 关闭 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,我尝试将其设置为空。我尝试关闭 BufferedReader、InputStreamReader 和 InputStream(如您在 finish 方法中所见),但没有任何效果,程序仍然死锁。有人遇到过同样的问题吗?有人看到解决方案了吗?
提前致谢!
编辑: 忘了说死锁前最后的控制台输出是
closed input stream
来自finish方法。这意味着 InputStreamReader 和 BufferedReader 没有被关闭。
替换
while (_isRunning)
{
while ((line = _reader.readLine()) != null) // The program deadlocks in this line when the GUI is closed
{
和
while (_isRunning && (line = _reader.readLine()) != null)
{
当您围绕 inputstream/reader 创建包装器时 - 对包装器执行关闭操作会关闭被包装的对象。所以你不需要所有那些
close
调用。我建议您停止自动关闭流的进程,您会收到来自
reader.readLine
的null
。