Вызывается ли finally() при нажатии кнопки остановки в eclipse?

Я уверен, что этот вопрос уже задавался здесь, но после поиска в Google и здесь я ничего не нашел.

Вот моя ситуация: у меня есть несколько потоков, записывающих в файл, и основной поток, который создает средство записи на печать и обрабатывает создание файла и закрытие средства записи на печать внутри блока finally в цикле try/catch. Когда я запускаю приложение внутри eclipse, я нажимаю кнопку остановки/завершения, и в файл ничего не записывается. Я хочу убедиться, что я все делаю правильно, или есть ли лучший способ справиться с закрытием модуля записи при завершении выполнения. Черт возьми, если есть лучший способ обработки нескольких потоков, записывающих в файл, я приветствую этот совет (сейчас я ужасно плохо разбираюсь в многопоточном программировании).


person CBredlow    schedule 15.12.2014    source источник
comment
Во время разработки вы, возможно, можете сбрасывать после каждой записи.   -  person aioobe    schedule 16.12.2014
comment
Некоторые идеи (относительно окончательного завершения): stackoverflow.com/questions/1410951/   -  person TJ-    schedule 16.12.2014
comment
@aioobe Не думал об этом. Просто использую это для личного теста, а не для производства, так что я попробую.   -  person CBredlow    schedule 16.12.2014
comment
Я бы предположил, что нет, особенно с вашим описанием проблемы. Скорее всего, Eclipse просто использует (небезопасный, устаревший) Thread.stop() для уничтожения вашего приложения, и поэтому после этого код вообще не выполняется.   -  person markspace    schedule 16.12.2014
comment
@TJ- Ага! Это может быть полезно, я думаю, я не мог правильно сформулировать это. Однако мне все же хотелось бы получить лучший совет по многопоточности, поэтому я должен просто отредактировать свой вопрос, чтобы отразить это?   -  person CBredlow    schedule 16.12.2014
comment
Вы никогда не можете быть уверены, что ваши блоки finally всегда будут выполняться. Насколько вам известно, ОС может завершить работу вашей JVM в любой момент, и среда выполнения Java ничего не может с этим поделать. Вы можете стараться изо всех сил (сбросить и закрыть как можно скорее, что может быть медленным), но вы никогда не можете быть уверены.   -  person GPI    schedule 16.12.2014
comment
@markspace На самом деле eclipse использует отдельный процесс для запуска программы и использует Process.destroy() при нажатии кнопки «Завершить».   -  person RealSkeptic    schedule 16.12.2014


Ответы (2)


Есть только редкий факт, который окончательно не исполняется. Одним из возможных вариантов может быть: System.exit(0). Использование finally предполагает, что оператор в блоках finally всегда выполняется.

Из-за вашей проблемы убедитесь, что ваш поток еще не выполнил ваш блок finally: убедитесь, что вы используете синхронизацию, если это необходимо - всегда проверяйте ее с помощью модульного теста.

person ServerSideCat    schedule 15.12.2014

Вам нужно присоединить свой основной поток к другим потокам перед вызовом методов flush() и close() в блоке finally, чтобы ваш основной поток дождался, пока другие потоки закончат запись в файл, прежде чем закрыть его.

person Lofty    schedule 15.12.2014