Java3D запускает несколько потоков системы и не устанавливает на них флаг isDaemon. Когда я устанавливаю (только) JFrame моего приложения, он не будет завершен, потому что эти потоки все еще запущены.
Вызов System.exit() кажется единственным способом прекратить работу приложения. (Или, конечно, убить его извне).
Как мне не нравится звонить System.exit() Я пробовал следующее (но безуспешно):
- вызов removeAllLocales() в VirtualUniverse: это завершает большинство потоков, но все же остается один (с именем J3D-Renderer-1).
- используя отражение для получения ссылки на поле ThreadGroup rootThreadGroupp в javax.media.j3d.MasterControl и установка isDeamon true в этой ThreadGroup. Это не показало никакого эффекта.
- получить ссылку на ThreadGroup с именем "Java3D" и вызвать interrupt() на нем: это привело к тому, что потоки java3d записывали InterruptedException в stderr, но больше ничего.
- найдите источники библиотеки Java3d-core и предложите патч: здесь я нашел репозиторий: https://github.com/hharrison/java3d-core и здесь: https://java.net/projects/j3d-core/sources. Позже он выглядит "официальным", но показывает, что последние изменения произошли 5 лет назад, а первый - для меня вилкой.
Я близок к отказу и звоню в System.exit(), но мне все равно не нравится. Вы знаете лучший способ?