私は、実際には1時間ごとにプロセスを実行し、1時間ごとにログファイルを作成するスケジューラであるメソッドを持っています.
このメソッドは、アプリケーションのライフ サイクルで 1 回呼び出したいので、静的ブロックから呼び出します。
しかし、ファイルが1時間で生成されることもあれば、早く生成されることもあるため、これは機能していないように感じます。静的ブロックは 1 回だけ実行されるとどこかで聞いたことがありますが、そうではありませんか?
はいの場合、私は何をすべきですか?
3 に答える
静的初期化ブロックは、クラスローダーがクラスをロードするときに1回だけ実行されます。それらが実行される時間は、アプリケーションロジックに非常に拘束されます。より正確には、異なるクラスローダーがクラスをロードして、静的ブロックを理論的に複数回実行できるようにする場合があります。
スケジューリングの目的で、Quartzスケジューラなどのスケジューラライブラリをすぐに使用してみてください。(http://quartz-scheduler.org)これは、最初は少しオーバーヘッドに見えるかもしれませんが、これらのライブラリは、最終的に必要になる可能性のある高度な機能を提供します。簡単な例:プログラムが1時間以内に停止して再起動した場合はどうなりますか?次に、プロセスはこの特定の時間に2回実行される可能性があります。クォーツを使用すると、この状況にも対処できます。
変数も必要です。
class ...
private static hasRun = false;
public static synchronize boolean runOnce ()
{
if (hasRun) return false;
hasRun = true;
// do something
return true;
}
このクラスが使用されていない場合、静的ブロックが呼び出されることはありません。
クラスのアンロードについての議論があります Javaでクラスをアンロードしますか?
クラスのアンロードが発生すると、静的初期化子の複数の呼び出しが発生する可能性があるよりも、複数のロードが可能になります。ただし、この場合、どのソリューションも失敗する必要があるため、私のソリューションは失敗します。
これは非常にまれでありそうもないと思います。しかし、多分あなたはあなたが環境をコントロールしていないときにケースに入れなければなりません
静的メソッドは、一度だけ実行されるという意味ではありません。static は、クラスのインスタンスをインスタンス化せずにメソッドの外部にアクセスできることを意味します。
私の頭の上からの最善の解決策。静的メソッドとともに更新できるように静的変数を用意し、そのメソッドが実行されるとすぐにその静的変数をインクリメントします。このメソッドが実行されるたびに、その変数をチェックし、すでにインクリメントされている場合はすぐに終了します。