Прежде всего, ваше приложение заканчивается или вы принудительно заканчиваете его? Если вы принудительно завершаете его (с помощью кнопки остановки), в этом отчете об ошибке Eclipse есть сведения о том, почему это может не работать.
В противном случае вы можете быть правы в том, что это специфичное для Windows поведение. Я на Mac, поэтому не могу подтвердить, извините. Тем не менее, я могу сказать вам, что следующая тестовая программа выполняет выполнение обработчиков завершения работы, как и ожидалось.
public class MyShutdownHook
{
public static void main( String[] args )
{
System.out.println( "Entering main." );
Runtime.getRuntime().addShutdownHook(
new Thread(
new Runnable() {
public void run() {
System.out.println( "Shutdown hook ran." );
}
}
)
);
System.out.println( "Exiting main." );
}
}
В Javadocs для Runtime # addShutdownHook упоминается, что перехватчики завершения работы не запускаются, когда JVM прерывается, не завершается нормально, поэтому, опять же, вы, вероятно, правы в своих предположениях. Это, как говорится, вот несколько вещей, чтобы попробовать. Опять же, извините, я не могу подтвердить это заранее - здесь нет Windows. (Благословенно!)
- Убедитесь, что JVM не включает опцию -Xrs . Это имеет побочный эффект на крюках отключения.
- Попробуйте запустить JVM с помощью опции -server или -client . По моему опыту, поведение в крайнем случае может зависеть от выбора режима виртуальной машины. (Особенно в отношении потоков - по крайней мере, на Mac.)
- Запускаете ли вы свое приложение под профилировщиком или чем-то подобным? Загрузка каких-либо собственных библиотек?
- Вы получаете какую-то фатальную ошибку и упускаете ее? Например, OutOfMemoryError или подобное?
- Попробуйте установить или снять флажок Запустить в фоновом режиме в диалоговом окне Запустить конфигурацию вашего приложения в Eclipse.
- Последнее, но не менее важное: если у вас есть возможность, вызовите System.exit () вручную. :)