线程崩溃时究竟发生了什么?

时间:2015-03-19 01:43:36

标签: java android multithreading

我对有未捕获的异常时会发生什么感到困惑。 例如:

public class TestActivity extends Activity {
  private Fish fish;

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

上面的代码在执行时崩溃应用程序,即使它在不同的线程上,因为fish从未初始化并且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也不会使应用程序崩溃,是因为它位于不同的线程池中?这是否意味着如果我有一个运行10个不同线程的线程池,整个线程池是否崩溃以及其他9个线程是否会死?

我有点困惑,因为我以前认为当一个线程崩溃时,只有那个线程死掉而它所居住的线程池不会受到影响。 有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

来自文档ThreadPoolExecutor

  

注意:当任务(例如FutureTask)中包含操作时   显式或通过诸如submit之类的方法,这些任务对象捕获和   保持计算异常,因此它们不会导致突然   终止,内部异常不会传递给它   方法。

代码不会导致应用程序崩溃的原因是因为异常是为您静默处理的。此外,当提交的任务遇到异常时,将以静默方式禁止其进一步执行。

如果是预定的线程池,则传递的值决定了可以同时调度的线程数。所以,你将在池中只有一个线程。这与固定线程池形成对比,固定线程池将保持池中的所述线程数,即使其中一些线程崩溃。

相关问题