5

Java util logging では、init() でハンドラーを開始し、destroy() でハンドラーを閉じると、完全に正常に動作します。ログ ファイルが作成されたなどです。ユーザーが通常どおりページを更新しても、ログは 1 つだけ作成されます。ファイル。

ただし、ユーザーがアプレットを使用してページを数回すばやく更新すると、destroy() が呼び出されないか、タスクが完了していないように見えます。init() が再度呼び出されるため、以前のファイルが想定されます。はまだロックされており、新しいログ ファイルが作成されます。

destroy() と finalize() の両方を使用してハンドラーを閉じようとしましたが、機能しません。誰でもこの問題を解決する方法を知っていますか?

もう 1 つの小さな質問は、init() が終了せずにページが更新された場合、実際にはどうなるかということです。プロセスを続行し、最終的に destroy() の呼び出しに失敗するか、それともそこで停止しますか?

4

3 に答える 3

4

Javaチュートリアルからの引用:

Java Plug-in ソフトウェアは、Java アプレットごとにワーカー スレッドを作成します。

マルチスレッド環境では、共有リソースに細心の注意を払う必要があります。最善かつ最も簡単な方法は、何も共有しないことです (最適なスケーリングとデッドロックの可能性はありません)。

「init」メソッドで毎回ハンドラーを初期化すると思います。そうであれば、1 つの静的共有ロガーを使用する必要があります (このリンクを確認してください)。状況を少し改善するのに役立ちますが、アプレットで複数のブラウザを起動すると、新しいログ ファイルが作成されます。この回避策は、Oracle では推奨されておらず、下位互換性のために保持されています。


推奨される簡単に実装できるソリューション - 「各アプレットには独自のロガーがあり、独自のファイルに書き込む必要があります」。ログ ファイル名生成のコード:

private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

private String generateFileName() {
    return String.format("applets-log/%s-%s.log", dateFormat.format(new Date()), UUID.randomUUID());
}

また、アプレット開発のベスト プラクティス.


あなたのマイナーな質問への回答 (変更済み):

Java プラグインのこの古いバグに関する議論によると、アプレットはクリーンアップのための事前定義された間隔でいつでも終了する可能性があります。そのため、「停止」または「破棄」メソッドにリソース クリーンアップ コードを配置する必要がありますが、そのコードが実行される内容に依存するべきではありません。

アプレットのライフサイクルはブラウザによって制御され、ホストしているドキュメントがブラウザによって破棄されたときに実行する機能をアプレットに与えるべきではありません。

6u10 以降、古いプラグインと新しいプラグインの両方が、アプレットを停止するための一定時間 (古いプラグインでは 1000 ミリ秒、新しいプラグインでは 200 ミリ秒) 後にアプレットのシャットダウンを強制します。

于 2012-04-14T16:08:47.663 に答える
0

FFでテストしていないことを願っています。ここを読んでください: https ://bugzilla.mozilla.org/show_bug.cgi?id = 638070

于 2012-04-12T11:55:43.267 に答える
0

マルチスレッド環境の根本的な制限に直面しただけです。

他のスレッドと比較して、いつ呼び出されるか、destroy()または呼び出されるかは本当にわかりません。finalize()ブラウザがページをリロードすると、アプレットが新しいスレッドに読み込まれる場合があります。ユーザーがリロードを 2 回すばやく押すとinit()、2 つの新しいスレッドが作成され、2 番目のスレッド (ユーザーが実際に表示するスレッド) を呼び出してから、init()ユーザーが表示しないスレッドを呼び出し、前のスレッドを呼び出す前に呼び出しdestroy()ます。ライフ サイクルのもう一方の端で、 finalize()ガベージ コレクション スレッドによって、オブジェクトが不要になった後、おそらく非常に長く呼び出されます。マルチスレッド環境で作業しており、スレッド間の操作の順序を当てにすることはできません。

Javadoc を引用するには:

アプレットは、単独で実行するのではなく、別のアプリケーション内に埋め込むことを目的とした小さなプログラムです。

ログ ファイルが 1 つしかない場合、ログの作成/オープン/クローズを制御する必要があるのは、実際には外部アプリケーションです。外側のアプリケーションが Web ブラウザーである場合、発生している問題を解決することはできません。 繰り返しになりますが、Web ブラウザーでアプレットを実行している場合は、ログをファイル システムに書き込むべきではありません。それは一般的に失礼な行動です。

Web ブラウザ内にアプレットのログ ファイルがどうしても必要な場合、最も簡単な解決策は、 を呼び出すたびinit()に、そのアプレットの呼び出しに固有の新しいファイルを作成することです。野心的になりたい場合は、ロック ファイルを使用して使用中のファイルを示し、ロックされdestroy()ていないログ ファイルを 1 つの大きなログ ファイルに連結することもできますが、スレッド間で連結プロセスを調整するという問題が発生します。

于 2012-04-17T02:56:56.847 に答える