我有点搞不懂,当有一个不寻常的例外时会发生什么。例如:
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个线程会死掉吗?
我有点困惑,因为我以前认为当线程崩溃时,只有线程会死,它所驻留的线程池不受影响。有人能给我解释一下吗?
发布于 2015-03-19 02:11:08
从docs ThreadPoolExecutor:
注意:当操作被显式地或通过诸如submit之类的方法包含在任务(例如FutureTask)中时,这些任务对象捕获和维护计算异常,因此它们不会导致突然终止,并且内部异常不会传递给该方法。
代码不会使应用程序崩溃的原因是,异常是由您默默地处理的。此外,当提交的任务遇到异常时,它的进一步执行将被静默抑制。
在调度线程池的情况下,传递的值确定可以并发调度的线程数。所以,池中只有一个线程。这与固定线程池形成了对比,后者将在池中保持所述线程数,即使其中一些线程崩溃。
https://stackoverflow.com/questions/29135852
复制相似问题