プロが教える店舗&オフィスのセキュリティ対策術

こんにちは、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"

A 回答 (1件)

ExecutorServiceをshutdownしていないからじゃないですか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
Page renderPageWithAd() throws InterruptedException {
long endNanos = System.nanoTime() + TIME_BUDGET;
Future<Ad> f = exec.submit(new FetchAdTask());
try {
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;
} finally {
exec.shutdown();
}
}
無事終了するようになりました。
ProKaseifuさん、ありがとうございます。

お礼日時:2009/03/04 20:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!