簡単なシナリオ:
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を表示するにはどうすればよいですか? 私はそれをキャッチする必要がありますか?それは安全な操作でしょうか?