2015-03-31 3 views
4

я создал следующий класс с именем, как ThreadClass (который является нить, как вы можете видеть), ее структура что-то вроде следующегоThread.stop() и, наконец,

class SomeTask implements Runnable 
{ 
    boolean someCondition=true; 
    public void run() { 
     try 
     { 
      while(someCondition) 
      { 
      //Here goes the Process Code 
      } 
     } 
     catch(Exception errorException) 
     { 
      //Catching the Exception 
     } 
     finally 
     { 
      ////I expect that this finally should run every time ,whatever happens in the world 
     } 
    } 

} 

Мой вопрос о наконец блока и остановки() метода

Как и выше класса реализует Runnable, так что я могу создать объект этого класса и начать нить его по телефону старта() method.I Я также в курсе тот факт, что я могу остановить с помощью stop() (Да, я знаю, это устарело).

То, что я хочу уточнить себя в том, что, если каким-то образом мне нужно вызвать метод остановки на объекте ThreadClass, тогда я могу полагаться на блок наконец выполнить, даже если поток остановлен путем вызова остановки (), поскольку я делаю некоторые важные закрывающие вещи в блоке finally.

+2

@nobalG Я думаю, что вы частично задаете неправильный вопрос. Не должно быть «если мне нужно вызвать устаревший метод». Создайте приложение таким образом, чтобы не требовались устаревшие методы. Тогда вам не нужно думать, что может случиться, если вы их назовете. – GhostCat

+0

Не было бы лучше реализовать метод 'myStop()', который устанавливает ваше условие в 'false', поэтому цикл' while' фактически останавливается? Даже если вам нужно запустить его позже с момента остановки, вы можете сохранить свои переменные/состояния и продолжить с этого на – Loki

+0

@ EddyG. Я знаю, что могу это сделать, я просто спрашивал в этом конкретном случае. – nobalG

ответ

3

Thread # stop работает, бросая исключение ThreadDeath, он не уничтожает поток мгновенно, как System.exit сдувает JVM. ThreadDeath можно даже поймать, хотя это не очень хорошая идея. Таким образом, блоки try все еще актуальны.

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

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

Это похоже на то, что technotes on Thread primitive deprecation точки из:

1) Поток может бросить исключение ThreadDeath практически в любом месте. Все синхронизированные методы и блоки должны быть изучены очень подробно, имея в виду это.

2) Нить может вызывать второе исключение ThreadDeath при очистке от первого (в предложении catch или finally). Очистка должна была повториться до тех пор, пока это не сработает. Код для обеспечения этого был бы довольно сложным.

Таким образом, есть некоторые проблемы, которые являются проблематичными, было бы очень сложно убедиться, что очистка выполнена правильно. Комментарий Джеймса правильный, если вообще возможно, вы должны использовать прерывание для такого рода вещей, чтобы поток мог надежно завершить свой бизнес.

+0

спасибо ....................... – nobalG

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