2013-11-23 3 views
1

У меня есть параллельный вопрос.Доступ к стеку потоков ZOmbie в java?

Давайте предположим следующий метод, который работает потоком (A).

void run(){ 
//some work 
    FileInputStream fis=new FileInputStream(new File("/home/share/_config")); 
//some work with fis 
} 

и предположит, есть ошибка, которая не является catchable, так как я получил от Java многопоточности, мы можем добавить неперехваченный менеджер исключений с setUncaughtExceptionHandler() методом, поэтому вопрос, как бы я получить доступ к файлу, я открыл (fis) из стека убитой нити и закрыть его от обработчика?

+1

Если вы используете предложение 'finally', чтобы закрыть свой' FileInputStream', здесь проблем нет. Существует также новый синтаксис в Java 7, который позволяет указывать вещи, которые необходимо закрыть в круглых скобках, в предложении 'try' –

+0

Обратите внимание, что' FileInputStream' объявляется как выбрасывающее исключение. –

+0

Либо ваш код хорошо написан и хорошо очищает ресурсы, либо беспорядок, и вы не можете его исправить. Притворство беспорядка можно убрать по краям, что ухудшает ситуацию хуже ИМХО. –

ответ

3

ПРИМЕЧАНИЕ: Код работает в Java 7+

Не делайте этого! Обычно метод, который открывает поток, должен также закрывать его! Поместите поток в примерочной с-ресурсом статье, то он будет закрыт автоматически:

void run() { 
    //some work 
    try (FileInputStream fis=new FileInputStream(new File("/home/share/_config"))) { 
     //some work with fis 
    } 
} 

потока fis будет закрыт, если поток выполнения покидает try блока - либо потому, что он заканчивает свою работу или из-за к исключению.

Также можно открыть несколько потоков ввода в том же предложении try-with-resource, используя разделительную точку с запятой (;) в качестве разделителя. См. http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html.

+0

, так что о нескольких ресурсах, он будет иметь вложенные 'try() {}' блоки, он тоже работает? и вообще, за исключением этого примера, как я могу получить доступ к стеку? –

+0

Нет, вы можете иметь несколько ресурсов внутри предложения try, разделенных точкой с запятой (;) – isnot2bad

+0

Если вы откроете поток внутри метода run и не публикуете его где-нибудь, доступ к нему извне невозможен! (Объем переменной InputStream - это метод, поэтому нет шанса!) – isnot2bad

Смежные вопросы