我需要关闭PipedInputStream和PipedOutputStream吗?

5

我正在编写一个简单的Swing GUI,其中包括一个文本框,用于打印调试消息和异常。目前,我已经将其设置为写入到PipedOutputStream,然后有一个守护线程从连接的PipedInputStream中读取并写入到文本区域。

当我尝试弄清如何在我的守护线程中关闭流时,我发现另一个答案称守护线程不应该持有任何资源。管道流算吗?它们需要被关闭吗?


你应该关闭所有可关闭的东西。 - user207421
@EJP,我问这个问题的原因是因为我不知道如何做到这一点。我不认为守护线程有定义的关闭行为?我认为你可以添加关闭挂钩,但如果这很重要,我觉得它应该被内置。 - Dimpl
1个回答

4
一个PipedInputStream / PipedOutputStream不持有任何操作系统资源。因此,任何建议说守护线程不应该持有资源都不适用于此处。(但请见下文!)
然而,这并不意味着您永远不需要关闭(至少)PipedOutputStream。根据您的应用程序,相应的PipedInputStream可能需要关闭管道以完成其工作。
关于其他答案
在查看答案和评论后,我认为他的论点是一种过度概括:
- 他正确地指出,任何同时打开许多(他说“数百个”)资源的东西(守护线程或其他)都是一个坏主意。 - 他还正确地说,在守护线程中进行关键文件更新是有风险的。但是,在Java中的任何线程中进行关键文件更新都存在相同的风险1。或者在C中。你只需要设计更新序列以实现故障安全...或依赖于像DB事务这样的东西来实现故障安全。
然而,从逻辑上讲(或从实际角度看),将此概括为守护线程不应该持有资源是不合理的。显然,存在不适用上述问题的用例。 1-应用程序可能会收到“kill -9”,这将导致其立即退出而不运行关闭挂钩。应用程序可能在关键更新的中间遇到“文件系统已满”。电力可能会停止。等等...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接