我在写一个简单的Swing GUI,它包含一个打印调试消息和异常的文本字段。我现在已经将它设置在我写入PipedOutputStream的地方,并且我有一个守护进程线程,它从连接的PipedInputStream中读取并写入文本区域。是否需要关闭PipedInputStream和PipedOutputStream
当我试图弄清楚如何在守护线程中关闭流时,我遇到了another answer,它说守护线程不应该保存任何资源。管道流是否计数?他们需要关闭吗?
我在写一个简单的Swing GUI,它包含一个打印调试消息和异常的文本字段。我现在已经将它设置在我写入PipedOutputStream的地方,并且我有一个守护进程线程,它从连接的PipedInputStream中读取并写入文本区域。是否需要关闭PipedInputStream和PipedOutputStream
当我试图弄清楚如何在守护线程中关闭流时,我遇到了another answer,它说守护线程不应该保存任何资源。管道流是否计数?他们需要关闭吗?
一个PipedInputStream
/PipedOutputStream
不抱任何操作系统资源。所以说守护线程不应该占用资源的任何建议都不适用于此。 (不过,见下文!)
但是,这并不意味着你不永远需要close()
(至少)PipedOutputStream
。根据您的应用程序,相应PipedInputStream
可能需要关闭管道以完成其工作。
关于other answer:
看答案和意见后,我认为他的说法是一种过度概括:
他是正确的事情(守护线程或者其他)有很多(他说“数百”)的资源同时开放是一个坏主意。
他也正确地说,在守护进程线程中执行严重的文件更新是有风险的。但是严重文件更新任何 Java中的线程具有相同的风险。或者在C中,您只需要设计更新序列以实现故障安全...或者依靠诸如数据库事务之类的方式实现故障安全。
但是,它不是逻辑上合理的(或者实际上是合理的)来概括这个,说守护线程不应该占用资源。很显然,在上述问题不适用的情况下有用例。
1 - 应用程序可能会出现“杀-9”,这将导致其退出立即不运行关闭挂钩。应用程序可能会在关键更新中获得“文件系统已满”。权力可能会消失。等等......
你应该关闭任何可以关闭的东西。 – EJP
@EJP我问这个问题的原因是因为我不知道该怎么做。我不相信守护进程线程定义了关闭行为?我认为你可以添加关闭钩子,但如果这很重要,我觉得它会被烘烤。 – Dimpl