

こんにちは、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"
No.1ベストアンサー
- 回答日時:
ExecutorServiceをshutdownしていないからじゃないですか?
回答ありがとうございます。
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さん、ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java final 1 2022/06/10 22:49
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングの問題です。大...
-
変数を動的に利用するには?
-
コンストラクタの引数の中のnew?
-
getActualMaximum(Calendar.DAY...
-
java 継承の問題で分からないと...
-
リフレクション Method.invoke(...
-
processingである処理をした画...
-
中カッコ{}だけの記述について
-
元旦からの日数を入力して、何...
-
System.exit()の値を取得したい
-
NoSuchMethodErrorが解決できま...
-
System.err. printlnとSystem.o...
-
動的配列が存在(要素が有る)か...
-
ループ処理の際、最後だけ","を...
-
ArrayListの要素数の上限
-
C言語 重複しない4ケタの乱数...
-
「配列定数は、イニシャライザ...
-
javaで質問です。 文字列2023/2...
-
テキストボックスに入力された...
-
JSPやサーブレットでSystem.out...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数を動的に利用するには?
-
中カッコ{}だけの記述について
-
プログラミングの問題です。大...
-
初心者なので教えてほしいです。
-
Javaでlog4jを使ってログ出力を...
-
コンストラクタの引数の中のnew?
-
System.exit()の値を取得したい
-
JSP/Servletのパラメータの受け...
-
GetterとSetterをやったのに。
-
javaで処理のやり方がわかりま...
-
オーバーロードで
-
Timerについて教えて下さい
-
NoSuchMethodErrorが解決できま...
-
インタフェイス実装と抽象クラ...
-
randomで
-
C# DatagridviewにExcelシート...
-
javaのプログラミングで作るRPG...
-
所持金の計算式とその表示の仕方
-
【java】同ディレクトリ別ファ...
-
多次元配列の出力のところがわ...
おすすめ情報