Java3D запускает несколько системных потоков и не устанавливает на них флаг isDaemon. Когда я распоряжаю (только) JFrame моего приложения, он не будет завершен, потому что эти потоки все еще работают.Есть ли способ закрыть приложение Java, которое использует java3d, не вызывая System.exit()?
Вызов System.exit() кажется единственным способом прекратить работу приложения. (Или, конечно, убить его извне).
Как я не люблю называть System.exit() Я попытался следующие (но без успеха):
- призывающих removeAllLocales() на VirtualUniverse: Это завершает большинство потоков, но все еще есть один (с именем J3D-Renderer-1).
- с использованием отражения для получения ссылки на поле ThreadGroup rootThreadGroupp в javax.media.j3d.MasterControl и установка isDeamon true в этой ThreadGroup. Это, похоже, не имело никакого эффекта.
- Получение ссылки на ThreadGroup с именем «Java3D» и вызов прерывания() на нем: это привело к тому, что потоки java3d записывали InterruptedException в stderr, но ничего больше.
- Найдите источники библиотеки Java3d-core и предложите исправление: я нашел репозиторий здесь: https://github.com/hharrison/java3d-core и здесь: https://java.net/projects/j3d-core/sources. Более поздний взгляд выглядит «официальным», но показывает, что последние изменения произошли 5 лет назад, а первый выглядит для меня частной вилкой.
Я близок к тому, чтобы отказаться от этого вызова и вызвать этот вызов System.exit(), но мне все еще не нравится. Вы знаете лучший способ?
Я не касался Java3D за многие годы, но, проверяя источник для одной старой программы Java3D, которую я написал, есть вызов 'System.exit (0)': -/Можете ли вы уточнить, почему вы не делаете хотите использовать это? – andrewdotn
Главным образом потому, что это кажется мне нечистым. И если это единственный способ очистки после использования java3d, будет невозможно написать тесты JUnit, которые используют Java3D. Если тесты JUnit запускают начало потоков Java3D, у меня нет хорошего варианта: я, очевидно, не могу вызывать System.exit() из тестов (это сделало бы невозможным получить результат тестов) поэтому я хотел бы иметь выход в этом случае. Спасибо, что посмотрели! – holgero
Вы попробовали метод 'SimpleUniverse # cleanup()'? Это немного больше, чем 'removeAllLocales()' – hoaz