一个简单的场景:
private static final ExecutorService executor =
Executors.newCachedThreadPool();
public static void main(String... args) throws InterruptedException, ExecutionException {
Future<byte[]> f = null;
for (int i = 0; i < 10; i++) {
f = executor.submit(new Callable<byte[]>(){
@Override
public byte[] call() {
System.out.println("Starting task.");
try {
return new byte[1500 * 1024 * 1024]; // 1500 mb
}
finally {
System.out.println("Task complete.");
}
}
});
}
// System.out.println(f.get().length);
}
当我运行上面的代码时,它(据称)运行没有错误。
(奇怪的是,当我在 NetBeans 中分析此代码时会引发OutOfMemoryError,但在我正常运行时不会。)
全部 10 个“任务完成”。消息立即显示出来,时间框架太短而无法实际分配字节数组。
当我取消注释最后一行时,会引发ExecutionException。
我知道代码示例有点荒谬......但是为什么根本没有抛出异常,我怎样才能让OutOfMemoryError出现?我必须抓住它吗?那会是安全的操作吗?