に送信された task(Callable
またはRunnable
)ThreadPoolExecutors
は に変換され、送信した taskと同じFuturnTask
という名前の prop が含まれます。callable
FuturnTask には以下のような独自のrun
メソッドがあります。スローされたすべての例外またはスロー可能なc.call()
ものはキャッチされ、という名前の小道具に入れられoutcome
ます。FuturnTask のget
メソッドを呼び出すと、スローoutcome
されます
FuturnTask.run Jdk1.8 ソース コードから
public void run() {
...
try {
Callable<V> c = callable;
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call();
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
// save ex into `outcome` prop
setException(ex);
}
if (ran)
set(result);
}
}
...
}
例外をキャッチしたい場合:
1.スカフマンの答え
2. ThreadPoolExecutor を新規作成するときに `afterExecute` を上書きする
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
Throwable cause = null;
if (t == null && r instanceof Future) {
try {
((Future<?>) r).get();
} catch (InterruptedException | ExecutionException e) {
cause = e;
}
} else if (t != null) {
cause = t;
}
if (cause != null) {
// log error
}
}