07/08/30 06:02:37 y/nNgxAS0
>>723
(OSごと終了させる場合)winはアプリケーションが終了する意のメッセージを最終的に生きてるウィンドウに投げるのでjavawだと
コンソールを開かないせいで先にjavaで作ったウィンドウが解放されてて
それでもVMはまだシャットダウンシーケンスの途中だからアプリのプロセスは終了してない。
けど、winから見れば終了する意のメッセージを投げても反応が返ってこないので強制終了しようとする。
んでSystem.halt()を使ったVMの強制終了と同じ処理に入ってシャットダウンフックがコケる。(今回はファイルIOいじってる途中だったからwinから見たらハングアップしたとみなされる?)
多分こんな流れで今回の現象が起こってるんだと思う。
結論言うと
1)winの場合DOS窓開いてjavaコマンドからアプリ起動
2)System.exit(int)で正常終了させる。
3)アプリケーションが終了することを各プラットフォームが通知(winの場合多分DOS窓の方に行く)
4)それによってシャットダウンフック発動
たぶん、スマートでシンプルでコードの変更が少ないのはこれしかないと思う。
けどプラットフォームによってはシャットダウンフックの実行に時間掛けてアプリが反応ないとプラットフォーム側でプロセス殺しにかかるかも。
プラットフォーム毎の終了の差異吸収は今のSUNの実装が限界だと思うから
結局、シャットダウンフック使うとプラットフォーム差異由来の
症状は避けられないと思うので長い目で見たらシャットダウンフックを使わないで独自のタイミングでファイルいじるしかないと思う。
シャットダウンフックで他にも処理してるならそこも見直す必要があるかと。
たしか、シャットダウンフックは登録順関係なく並列に実行してたはず(今はどうか知らないし、実装レベルの話かもしれない)
なので各フックがスレッドセーフかも見ておいた方が良いかも。
IOは時間かかって他からの読み書きも気にしなきゃいけないので
シャットダウンフックでやるのは危険と考えておくべきでは?