Я расстраиваюсь, пытаясь избавиться от этого надоедливого исключения, которое отображается, когда моя программа Java завершается:
Исключение при удалении ссылки: java.lang.InterruptedException java.lang.InterruptedException в java.lang.Object.wait (собственный метод) в java.lang.ref.ReferenceQueue.remove (неизвестный источник) в java.lang.ref.ReferenceQueue. удалить (неизвестный источник) в sun.java2d.Disposer.run (неизвестный источник) в java.lang.Thread.run (неизвестный источник)
Источником моих бед является использование Класс FileSystemView. Мой код адаптирован из код на этой странице, используя File.listRoots(), а затем FileSystemView для отображения понятных имен/описаний моих дисков 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 и т. д.), которые вызывают проблему.
Запуск этого кода сам по себе работает нормально. Запуск его в сочетании с гораздо большим количеством ресурсов Windows с использованием JNA приводит к тому, что проблема возникает гораздо чаще. Полный пример проблемного кода можно найти, выполнив тестовый класс здесь, в Windows.
Я искал ответы на все вопросы и подсказки, что можно попробовать, но, похоже, ничего не работает (пока). Для справки, я просмотрел эти две темы, среди прочего, которые описывают мои симптомы, но не дают полезных результатов:
- Иногда InterruptedException при выходе из приложения Swing
- InterruptedException после отмены диалога открытия файла - 1.6.0_26 а>
Первая ссылка выше обсуждает потоки демона и не-демона. Я подтвердил, что «основной» поток, который достигает конца программы, когда возникает эта проблема, является единственным запущенным потоком, не являющимся демоном. Оба потока выше и многие другие источники ссылаются на удаление других компонентов Swing как на решение, но единственный код «Swing», который я использую, — это FileSystemView, и я не вижу никаких вариантов для его удаления.
Вопросы:
- Есть ли способ красиво отключить потоки демона, которые запускаются при использовании FileSystemView?
- Есть ли способ, которым я могу легко «обернуть» свой объект FileSystemView внутри контейнера (никогда не отображаемый пользователю), который я могу затем легко удалить (), чтобы, возможно, ответить на предыдущий вопрос?
- Существует ли альтернатива FileSystemView, которая дает подробное описание имен дисков и томов Windows (например, A: (Floppy Drive), D: (CD-Rom) и т. д.), что позволяет избежать запуска потоков демона Swing, которые, по-видимому, вызывают эти проблемы?
SwingWorker
при выполнении этого раздела. - person Craig   schedule 03.09.2015