java.util.concurrent.Future get() のタイムアウトを使ったコードが終了しない
こんにちは、kataoka700と言います。
以下のコードは、「Java並行処理プログラミング(ソフトバンク)」P.150のプログラムを一部変更した物です。
実行してみると終了するまで時間がかかります。しかし、mainは終わっているようです。なぜ終了しないのでしょうか。
ご存知の方はいませんか。
■プログラム
import java.util.concurrent.*;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
public class RenderWithTimeBudget {
private static final Ad DEFAULT_AD = new Ad();
private static final long TIME_BUDGET = 0;
private static final ExecutorService exec = Executors.newCachedThreadPool();
Page renderPageWithAd() throws InterruptedException {
long endNanos = System.nanoTime() + TIME_BUDGET;
Future<Ad> f = exec.submit(new FetchAdTask());
Page page = renderPageBody();
Ad ad;
try {
long timeLeft = endNanos - System.nanoTime();
ad = f.get(timeLeft, NANOSECONDS);
} catch (ExecutionException e) {
ad = DEFAULT_AD;
} catch (TimeoutException e) {
ad = DEFAULT_AD;
f.cancel(true);
}
page.setAd(ad);
return page;
}
Page renderPageBody() { return new Page(); }
static class Ad {
}
static class Page {
public void setAd(Ad ad) { }
}
static class FetchAdTask implements Callable<Ad> {
public Ad call() {
return new Ad();
}
}
public static void main(String[] args) {
RenderWithTimeBudget rw = new RenderWithTimeBudget();
try {
rw.renderPageWithAd();
System.out.println("main() 終了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
■実行結果
C:\>javac RenderWithTimeBudget.java
C:\>java RenderWithTimeBudget
main() 終了
C:\>
■環境
OS:WindowsXP SP3
Java:java version "1.6.0_11"
お礼
返事が遅くなってすみません。ご回答ありがとうございます。