Моя проблема в том, что мое завершение происходит слишком рано, не дожидаясь, пока процесс очистится.Когда процесс Java умирает после остановки?
Однако, если в моем отключенном потоке я добавляю while(true) Thread.sleep(1000);
, процесс очищается отлично и, очевидно, никогда не выключается.
Это меня смущает, так как завершение завершается до того, как многие потоки не-демона завершены. Например, если я напишу очень простую тестовую программу, в которой нет бесконечных циклов main()
и поток выключения, main
будет прекращен (без какого-либо следа исключения, исходящего от ловли InterruptedException
s).
Так как я могу сказать, что выключение происходит, когда завершается завершающий поток run
. Я думаю, что из этих знаний я могу исправить это, закончив его в цикле опроса, опросив для Future
, что означает успешное завершение остальных моих процессов. Но это кажется неправильным - я просто хочу дождаться завершения всех потоков, отличных от daemon, и я, конечно, не хочу делать опрос.
- Я исправляю, что завершение работы завершено, когда завершается завершение работы
run
метода завершения работы выключателя? - Что такое хороший способ выполнения выключения, ожидая завершения моих текущих задач завершения?
* shutdown thread * выходит чисто; он просто запускает много асинхронной (будущей) работы, которую я также хотел бы подождать. Но наши обещания асинхронны и не блокируются. Похоже, что блокирующее ожидание сделает трюк. – djechlin
Вам нужно сделать асинхронный материал в потоках не-демона или иметь хотя бы один поток без демона, который ждет, пока все будущие/асинхронные вещи не будут завершены. Примечание. Если эти потоки выполнялись до System.exit(), они были бы уничтожены и их нужно будет перезапустить в интересах выключения. Возможно, ваши библиотеки не справятся с этим слишком хорошо. –
Он закрывается, пока у меня все еще есть пулы потоков без демона. – djechlin