在没有其他摆动组件的情况下使用 FileSystemView 的 InterruptedException

InterruptedException using FileSystemView without other swing components

试图摆脱 Java 程序完成时显示的这个讨厌的异常,我感到很沮丧:

Exception while removing reference: java.lang.InterruptedException java.lang.InterruptedException at java.lang.Object.wait(Native Method) at java.lang.ref.ReferenceQueue.remove(Unknown Source) at java.lang.ref.ReferenceQueue.remove(Unknown Source) at sun.java2d.Disposer.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

我的问题是使用 FileSystemView class. My code is adapted from code on this page,使用 File.listRoots(),然后使用 FileSystemView 来友好地显示 names/descriptions 我的 Windows 驱动器。代码的简化版本运行良好,但留下守护线程 运行 导致问题,是这样的:

File[] roots = File.listRoots();
FileSystemView fsv = FileSystemView.getFileSystemView();
for (File f : roots) {
    System.out.format("%s (%s) %d/%d%n", fsv.getSystemDisplayName(f), fsv.getSystemTypeDescription(f),
            f.getUsableSpace(), f.getTotalSpace());
}

使用 FileSystemView 似乎会启动一些导致问题的守护线程(Java2D Disposer、AWT-Windows、Swing-shell 等)。

运行 该代码本身似乎工作正常。 运行 它与使用 JNA 的更多 windows 资源相关联,导致问题更频繁地发生。可以通过在 Windows.

上执行测试 class here 来找到问题代码的完整示例

我四处寻找答案,并获得了可以尝试的提示,但似乎没有任何效果(目前)。作为参考,我查看了以下两个主题,它们描述了我的症状但没有提供有用的结果:

上面的第一个 link 讨论了守护线程与非守护线程。我已经确认 "main" 线程是唯一的非守护线程 运行,当此问题发生时它已到达程序末尾。上面的两个线程和许多其他来源都将处理其他 swing 组件作为解决方案,但我使用的唯一 "swing" 代码是 FileSystemView,我没有看到任何处理它的选项。

问题:

我怀疑与 FileSystemView 有关的某些事情需要在 Even Dispatch Thread 上执行代码 - 该线程用于富客户端桌面应用程序中的事件调度和处理。

有关详细信息,请参阅 Concurrency in Swing