在没有其他摆动组件的情况下使用 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 来找到问题代码的完整示例
我四处寻找答案,并获得了可以尝试的提示,但似乎没有任何效果(目前)。作为参考,我查看了以下两个主题,它们描述了我的症状但没有提供有用的结果:
- Occasional InterruptedException when quitting a Swing application
- InterruptedException after cancel file open dialog - 1.6.0_26
上面的第一个 link 讨论了守护线程与非守护线程。我已经确认 "main" 线程是唯一的非守护线程 运行,当此问题发生时它已到达程序末尾。上面的两个线程和许多其他来源都将处理其他 swing 组件作为解决方案,但我使用的唯一 "swing" 代码是 FileSystemView,我没有看到任何处理它的选项。
问题:
- 有没有办法很好地关闭在使用 FileSystemView 时启动的守护线程?
- 有没有一种方法可以让我轻松地 "wrap" 我的 FileSystemView 对象在一个容器中(从不显示给用户),然后我可以轻松地处理(),以可能回答上一个问题?
- 是否有 FileSystemView 的替代方案,它提供了对 windows 驱动器名称和卷名称(例如,A:(软盘驱动器)、D:(CD-Rom)等)的丰富描述,从而避免了启动似乎会导致这些问题的 swing 守护进程线程?
我怀疑与 FileSystemView
有关的某些事情需要在 Even Dispatch Thread 上执行代码 - 该线程用于富客户端桌面应用程序中的事件调度和处理。
有关详细信息,请参阅 Concurrency in Swing。
试图摆脱 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 来找到问题代码的完整示例我四处寻找答案,并获得了可以尝试的提示,但似乎没有任何效果(目前)。作为参考,我查看了以下两个主题,它们描述了我的症状但没有提供有用的结果:
- Occasional InterruptedException when quitting a Swing application
- InterruptedException after cancel file open dialog - 1.6.0_26
上面的第一个 link 讨论了守护线程与非守护线程。我已经确认 "main" 线程是唯一的非守护线程 运行,当此问题发生时它已到达程序末尾。上面的两个线程和许多其他来源都将处理其他 swing 组件作为解决方案,但我使用的唯一 "swing" 代码是 FileSystemView,我没有看到任何处理它的选项。
问题:
- 有没有办法很好地关闭在使用 FileSystemView 时启动的守护线程?
- 有没有一种方法可以让我轻松地 "wrap" 我的 FileSystemView 对象在一个容器中(从不显示给用户),然后我可以轻松地处理(),以可能回答上一个问题?
- 是否有 FileSystemView 的替代方案,它提供了对 windows 驱动器名称和卷名称(例如,A:(软盘驱动器)、D:(CD-Rom)等)的丰富描述,从而避免了启动似乎会导致这些问题的 swing 守护进程线程?
我怀疑与 FileSystemView
有关的某些事情需要在 Even Dispatch Thread 上执行代码 - 该线程用于富客户端桌面应用程序中的事件调度和处理。
有关详细信息,请参阅 Concurrency in Swing。