首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当线程崩溃时会发生什么?

当线程崩溃时会发生什么?
EN

Stack Overflow用户
提问于 2015-03-19 01:43:36
回答 1查看 2.8K关注 0票数 0

我有点搞不懂,当有一个不寻常的例外时会发生什么。例如:

代码语言:javascript
运行
复制
public class TestActivity extends Activity {
  private Fish fish;

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

上面的代码在执行时会使应用程序崩溃,即使它位于不同的线程上,因为fish从来没有初始化过并且发生了NPE。然而:

代码语言:javascript
运行
复制
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个线程会死掉吗?

我有点困惑,因为我以前认为当线程崩溃时,只有线程会死,它所驻留的线程池不受影响。有人能给我解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-19 02:11:08

从docs ThreadPoolExecutor

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

代码不会使应用程序崩溃的原因是,异常是由您默默地处理的。此外,当提交的任务遇到异常时,它的进一步执行将被静默抑制。

在调度线程池的情况下,传递的值确定可以并发调度的线程数。所以,池中只有一个线程。这与固定线程池形成了对比,后者将在池中保持所述线程数,即使其中一些线程崩溃。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29135852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档