こんにちは、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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数を動的に利用するには?
-
プログラミングの問題です。大...
-
初心者なので教えてほしいです。
-
中カッコ{}だけの記述について
-
System.exit()の値を取得したい
-
C# DatagridviewにExcelシート...
-
(長文です。すみません。)rep...
-
javaのプログラミングで作るRPG...
-
java 素数判定について
-
NoSuchMethodErrorが解決できま...
-
HTMLテキストを編集する際に、...
-
助けて下さい…
-
java 継承の問題で分からないと...
-
Socketの接続のタイムアウトを...
-
JSPやサーブレットでSystem.out...
-
javaで質問です。 文字列2023/2...
-
System.err. printlnとSystem.o...
-
論理演算子”||”またはの入力方法
-
IF関数でEmpty値を設定する方法。
-
ループ処理の際、最後だけ","を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数を動的に利用するには?
-
中カッコ{}だけの記述について
-
プログラミングの問題です。大...
-
NoSuchMethodErrorが解決できま...
-
Javaでlog4jを使ってログ出力を...
-
System.exit()の値を取得したい
-
コンストラクタの引数の中のnew?
-
Javaで日本語の出力が文字化けする
-
インタフェイス実装と抽象クラ...
-
randomで
-
Java プログラム public class ...
-
日本語が文字コードによっては...
-
Socketの接続のタイムアウトを...
-
GetterとSetterをやったのに。
-
javaで特定の文字列から特定の...
-
JSP/Servletのパラメータの受け...
-
(1)を表示するには
-
【初心者です】javaで平均値を...
-
javaのプログラミングで作るRPG...
-
【java】同ディレクトリ別ファ...
おすすめ情報