我正在编写一个简单的Swing GUI,其中包含一个打印调试消息和异常的文本字段。我现在已经设置了我写入PipedOutputStream的位置,并且我有一个守护程序线程,它从连接的PipedInputStream中读取并写入文本区域。
当我试图弄清楚如何在我的守护程序线程中关闭流时,我遇到了another answer,它说守护程序线程不应该拥有任何资源。管道流是否有效?他们需要关闭吗?
答案 0 :(得分:2)
PipedInputStream
/ PipedOutputStream
不包含任何操作系统资源。因此,任何说守护程序线程不应该保存资源的建议都不适用于此处。 (但见下文!)
但是,这并不意味着您 至少需要close()
PipedOutputStream
。根据您的应用程序,相应的PipedInputStream
可能需要关闭管道才能完成其工作。
关于other answer:
在查看答案和评论之后,我认为他的论点过于笼统:
他是正确的,任何(守护线程或其他)有很多资源(他说"数百")同时打开的资源是个坏主意。
他说在守护程序线程中执行关键文件更新存在风险也是正确的。但是,在Java中的任何线程中执行关键文件更新具有相同的风险 1 。或者在C中。您只需要将更新序列设计为故障安全的......或者依靠DB事务等方法来实现故障安全。
然而,将这一点概括为说守护程序线程不应该保留资源在逻辑上是合理的(或者是实际上不合理的)。显然,存在上述问题不适用的用例。
1 - 应用程序可能会获得" kill -9"这将导致它立即退出而不运行关闭钩子。应用程序可能会获得一个完整的"文件系统。在关键更新的中间。电力可能会消失。等等......