2015-03-19 5 views
0

Я немного смущен тем, что происходит, когда есть неперехваченное исключение. Например:Что именно происходит при сбое потока?

public class TestActivity extends Activity { 
    private Fish fish; 

    void onCreate(Bundle savedInstanceState) { 
    new Thread(new Runnable() { 
     fish.swim(); 
    }).start(); 
    } 
} 

Код выше сбой приложения при выполнении даже если его в другом потоке, так как рыба никогда не была инициализирована и NPE происходит. Однако:

public class TestActivity extends Activity { 
    private Fish fish; 

    void onCreate(Bundle savedInstanceState) { 
    ScheduledExecutorService executorService =  
    Executors.newScheduledThreadPool(10); 
      executorService.schedule(new Runnable() { 
       @Override 
       public void run() { 
        fish.swim(); 

       } 
      }, 0, TimeUnit.SECONDS); 
    } 
} 

Код выше не врезаться приложение, даже если она производит NullPointerException, это потому, что он находится в другой пул потоков? Означает ли это, если у меня есть threadpool с 10 различными потоками, работает ли весь threadpool crash и 9 других потоков?

Я немного смущен, потому что раньше думал о том, что когда поток падает, только эта нить умирает и поток, в котором он жил, не затрагивается. Может кто-нибудь объяснить это мне, пожалуйста?

+0

Новая тема вне жизненного цикла приложения Android. – fukanchik

ответ

1

Из опубликованных документов ThreadPoolExecutor:

Примечания: Когда действия заключаются в задачах (например, FutureTask) либо явно или с помощью таких методов, как представить объекты этих задач улова и поддерживать вычислительные исключения, и поэтому они не вызывают резкое завершение , и внутренние исключения не передаются этому методу .

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

В случае запланированного пула потоков передаваемая вами величина определяет количество потоков, которые могут быть запланированы одновременно. Итак, у вас будет всего одна нить в пуле. Это контрастирует с фиксированным пулом потоков, который будет поддерживать указанное количество потоков в пуле, даже если некоторые из них сбой.

+1

удивительный, спасибо. – Allenktv

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