【问题标题】:Howto cancel a delayed FileInputStream file-open如何取消延迟的 FileInputStream 文件打开
【发布时间】:2009-08-08 09:05:06
【问题描述】:

有没有办法取消长时间运行的文件打开操作?由于防病毒扫描、映射的网络驱动器等造成的长时间延迟。

new FileInputStream("a_file_that_the_antivirus_" + 
    "will_process_for_minutes_before_returning.jar")
// process the contents...

在上面的例子中,第一行可以阻塞,但是我不知道有什么方法可以异步取消那个操作(如果我们得到了新的 inputstream 对象,取消就像 in.close() 一样简单,但是这个问题不是关于那种情况)。

是否有可能中断打开的进程 - 可能使用 NIO - 或者是否已经有一种机制,例如简单的 Thread.interrupt() 来取消打开?

操作系统:主要是 Windows XP+、Java 6+,阻塞通常是由于一些更大更深的 jar 文件 - 例如,Eclipse 的插件或我自己的复杂应用程序。

【问题讨论】:

    标签: java file-io


    【解决方案1】:

    假设没有解决方案(我找不到解决方案,而且我怀疑我们被困在操作系统级别的调用中)在工作线程中实际执行打开尝试并最终超时会有多糟糕等待那个线程。然后你的主要处理可以继续,而在后台,工作线程最终会完成它的打开,但会立即再次关闭文件 - 没有人再等待它了。

    是的,它会占用 FD 资源,但可能不会很大 - 无论如何,您可以限制工作线程的数量来控制影响。

    【讨论】:

    • 基本上整个文件处理已经在 SwingWorker 中完成,所以这不是问题。问题是当用户想要取消操作时,我无法可靠地取消打开 - 例如它将保持线程阻塞并且 JVM 无法正常退出。
    • 我认为这个想法是在另一个线程中打开并使用等待/通知来检测何时完成。等待很容易被取消。实际的 open 调用继续在另一个线程中运行,然后在最终完成时被丢弃。
    • 没错,但“最终”通常为时已晚。
    【解决方案2】:

    fileinputstream 被阻塞。你可能想看看Asynchronous File I/O in Javajava nio

    【讨论】:

    • 啊,又是 Mina 框架。我想我必须更仔细地看看它:) 但是,它只声明 Linux 并且遇到相同的文件打开问题 - 这根本不是异步的。我会仔细检查 NIO 是否打开了文件/通道。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2023-02-09
    • 2016-03-25
    相关资源
    最近更新 更多