如果从执行程序的线程中抛出错误该怎么办?

时间:2016-05-29 09:35:18

标签: java exception

我有一个用于任务执行的线程池。据我所知,OutOfMemoryError发生后继续工作是非常危险的。如果发生这种情况,我们应该终止申请。因此,请考虑以下事项:

ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
    @Override
    public void run() {
        throw new OutOfMemoryError();
    }
});
es.shutdown();
es.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
System.out.println("After throwing OutOfMemoryError");

在此代码中,我们将抛出任务OutOfMemoryError。但即使在投掷之后它继续工作并打印After throwing OutOfMemoryError

安全吗?我的意思是,我们可能最终导致数据损坏......如果抛出Error,我们是否应该准备好这种场景和设计任务来终止应用程序?

2 个答案:

答案 0 :(得分:1)

我建议你做什么

  • 保留并检查Future返回的es.submit,这是错误发生的地方。
  • 始终使用try { doSomething(); } catch(Throwable t) { }运行任务,以便您可以操作任何错误,而无需检查您可能已丢弃的Future对象。

答案 1 :(得分:1)

给定示例中有两个线程 - 启动程序的主线程和执行指定任务的线程。所有线程都是自己分配的,彼此独立,堆栈。但是,所有线程都使用相同的内存堆。这就是OutOfMemoryError影响整个程序的原因,而不仅仅是单个线程。

一般来说,在终止(成功或其他)时,任务执行线程不会影响任何其他线程的执行流程(除非这是它的设计目的)。这就是为什么,即使任务线程被终止,所提供示例中的主线程也会继续运行。

我强烈建议您阅读Java Concurrency in Practice一书,以便更好地了解Java并发性和并行性。