
Runtime#addShutdownHook(...) を利用して、
PCのシャットダウン時刻をファイルに保存するプログラムを作成しています。
ところが、Windowsのログオフやシャットダウンを選択しても、シャットダウンフックが呼ばれないことがあります。
OS Windows XP SP2
JVM Sun 1.4.2_08-b03
ただし、該当のプログラムを
java で起動したときは正しくシャットダウンフックが呼ばれて、終了時刻が保存されています。
javawで起動したときだけシャットダウンフックが無視されます。
コンソールやウィンドウを表示させずに動かしたいのでjavawにしたのですが、何かいい方法はないでしょうか?
No.1ベストアンサー
- 回答日時:
こんばんは。
>java で起動したときは正しくシャットダウンフック
>が呼ばれて、終了時刻が保存されています。
>javawで起動したときだけシャットダウンフックが
>無視されます。
試してみたら、確かにjavawではシャットダウンフックが呼ばれませんねぇ。
でも、FrameやJFrameを使ったGUIアプリケーションの場合は呼ばれているみたいです。
あてずっぽうなんですが、javawではイベントディスパッチスレッドの有無が関係してシャットダウンフックが呼ばれたり呼ばれなかったりするんじゃないでしょうか。
こうすると↓javawでもシャットダウンフックが呼ばれるみたいです。
ちなみにJ2SE 1.5.0_02 で試しました。
import java.util.*;
import java.io.*;
public class ShutdownHookTest {
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
PrintWriter pw = null;
try {
pw = new PrintWriter(new FileWriter("log.txt", true));
pw.println(new Date());
}
catch (IOException ex) {}
finally {
if (pw != null)
pw.close();
}
}
});
java.awt.Frame frame = new java.awt.Frame();
frame.pack();
//↑Frameを表示させずに、イベントディスパッチスレッドを動かすためのpack()
//ここをコメントアウトするとシャットダウンフックがかからない。
try {
while (true) {
Thread.sleep(10000);
}
}
catch (InterruptedException ex) {}
}
}
しかし、回避策とは言え、表示させもしないFrameを作るのはなんともかっこ悪いです。
やはり、コマンドプロンプトを表示させずにjava.exeを呼ぶことを考えたほうがいいのかもしれません。
でも、いい方法が思いつきません。
それにしても、この症状はJVMのバグなんでしょうか?
それとも仕様なんでしょうか?
変ですね。
No.4
- 回答日時:
javawとShutdownHookで検索するとそれらしいネタが(^^;
まとめると、Windowsではウィンドウの終了時(多分ログオフ時も一緒)に
終了してよいかどうかの問い合わせメッセージを「ウィンドウ」に対して行うので、
コンソールを持たないjavawではそのメッセージを受け取れず、
shutdownHookが呼び出されない、ということになります。
なので、javawを使うのであればRuntime#addShutdownHook以外の方法を考える
しかなさそうですね。
#GUIがある場合は、addShutdownHookでも大丈夫そうですが。
対策としてはちょっと思いつきません。
#C++でWindowsのネイティブプログラムを組めば何とかなりそうですケド・・・
No.3
- 回答日時:
またまた、訂正です。
よく考えたら、最後の
try {
while (true) {
Thread.sleep(10000);
}
}
catch (InterruptedException ex) {}
これは必要なかったですね。
せっかくイベントディスパッチスレッドを動かしたんだから、何もメインスレッドまでぐるぐる待機させる必要なかったです。
たびたび、すみません。
ありがとうございます。
コンソールもGUIも無いと終了するのに困ってしまうので、とりあえずタスクトレイにアイコン表示して、SWTのaddDisposeListener()で終了時のイベントハンドラを使うようにして解決できました。
No.2
- 回答日時:
すみません。
ちょっと訂正です。
>試してみたら、確かにjavawではシャットダウンフックが呼ばれませんねぇ。
↓
試してみたら、確かにjavawではWindowsのログオフやシャットダウンではシャットダウンフックが呼ばれませんねぇ。
プログラム自身が終了する場合では、javawでもシャットダウンフックが呼ばれるのは、こちらでも確認できまた。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 7 Media Playerが開かない。ファイルアイコンを右クリックしても「プロパティ」が表示されない。 2 2023/02/05 14:45
- その他(OS) Widgets.exeがオーバーランしました とでます 1 2022/10/15 23:15
- Windows 10 更新プログラムの適用を止めたい 4 2022/11/04 01:25
- デスクトップパソコン タスク、プログラム実行後に自動シャットダウンしたい 3 2023/08/25 18:01
- Windows 10 パソコンが正常にシャットダウンしない。 こんばんは。 先日WindowsアップデートをしてWindo 2 2023/02/24 23:11
- Windows 10 パソコン スリープで使っていると電源が点滅していますが 機械 マザーボードに悪いですか? 4 2023/03/13 18:09
- デスクトップパソコン パソコンが勝手に起動 なぜ? 7 2023/07/23 14:58
- その他(OS) 助けてw Windows11パソコンがシャットダウン出来ない 5 2023/03/07 22:53
- デスクトップパソコン パソコンのこの症状に悩まされる。 6 2023/02/24 12:52
- デスクトップパソコン パソコンについて質問です。 指定時間に使ってなかったら シャットダウンするように設定したいのですが 1 2023/05/30 13:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
importするには java.io.*; imp...
-
setAttribute(String, int)は適...
-
<forEach> 内で供給された "ite...
-
文字サイズが可変のラベル
-
JEditorPaneで表示したHTMLを、...
-
import 文
-
Javaを使ってデジタル時計を作...
-
Javaで常駐するソフトを作って...
-
Javaアプリケーションのアイコ...
-
文字列を数式に
-
プログラミングの問題です。大...
-
System.err. printlnとSystem.o...
-
オブジェクトの中のプロパティ...
-
C言語のポインターに関する警告
-
double型変数値の整数部分のみ...
-
実数からの小数部の取得
-
ループ処理の際、最後だけ","を...
-
C言語 重複しない4ケタの乱数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
<forEach> 内で供給された "ite...
-
干支の計算で。。。
-
importするには java.io.*; imp...
-
Javaを使ってデジタル時計を作...
-
シャットダウンフックが呼ばれない
-
setAttribute(String, int)は適...
-
Selenium IDEでexportしたコー...
-
JAVA 乱数で同じ数字を出さな...
-
文字列を数式に
-
Java での グローバルIP取得
-
importとextendsの用い方の違い...
-
文字サイズが可変のラベル
-
ColabでのPytorchのエラー
-
Swingなしで画像ファイルロード
-
ActionForm form にnullが入っ...
-
GridBagLayoutについての質問
-
ファイル名を動的に生成したい
-
Xercesを使ったjavaでのXML解析
おすすめ情報