我有一个用于任务执行的线程池。据我所知,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
,我们是否应该准备好这种场景和设计任务来终止应用程序?
答案 0 :(得分:1)
我建议你做什么
Future
返回的es.submit
,这是错误发生的地方。try { doSomething(); } catch(Throwable t) { }
运行任务,以便您可以操作任何错误,而无需检查您可能已丢弃的Future
对象。答案 1 :(得分:1)
给定示例中有两个线程 - 启动程序的主线程和执行指定任务的线程。所有线程都是自己分配的,彼此独立,堆栈。但是,所有线程都使用相同的内存堆。这就是OutOfMemoryError
影响整个程序的原因,而不仅仅是单个线程。
一般来说,在终止(成功或其他)时,任务执行线程不会影响任何其他线程的执行流程(除非这是它的设计目的)。这就是为什么,即使任务线程被终止,所提供示例中的主线程也会继续运行。
我强烈建议您阅读Java Concurrency in Practice一书,以便更好地了解Java并发性和并行性。