4


0

私はこれを使用してデータベースをポーリングすることを計画しています。これには10〜15分以上かかることがあります。そのためにはタイマーを使用する必要があります。

7 Answer


8


タスクをすばやく完了させたいが実際にやるべきことに時間がかかる場合は、2つに分割することができます。 Timerが起動したときに実行されるものを用意して、適切なタイミングで処理が行われるようにします。ただし、深刻な処理は別の関数(別のスレッドなど)に任せることができます。 APIから見ると、Timerタスクが時間がかかりすぎるという問題は、それらがスレッドを独占し、後続のタスクを遅らせる可能性があるため、時間のかかる処理を別のスレッドに移すことでその問題を回避できるはずです。 あなたの肩書きの質問に答えるために、「すぐに」とは「タイマーが再び発火する必要がある前にそれを終えるべきである」ことを意味するでしょう。


4


Swing固有のものではなく、java.util.Timerについて話しているのでしょうか。

私の記憶が正しければ、そのタイマーは基本的にJVM内のすべてのタイマーインスタンスを処理する単一のバックグラウンドスレッドへの実行を延期するので、問題は1つのタイマーが他のすべてのタイマーに対してそのスレッドを占有することです。

だからすぐにあなたのアプリケーションの他の部分とあなたが他のタイマーを使うかどうかに依存するだろう。

一般的に、私はそれを深刻なことに使わないようにするか、あるいは単に新しいスレッドを生成させます。


3


タイマータスクから作業を行うためにスレッドを生成した場合でも、スレッドの完了よりも時間が早くかかるため、作業負荷が低下することに注意してください。


1


タイマーTASKはすぐに実行されるはずです。ポーリング間隔はその使用法とは無関係です。 この2つを混同しないように注意してください。


1


これに関連して、それはそうでなければ次のイベントが処理されないので次のタイマーイベントが起こるまであなたがあなたの仕事を完了しなければならないことを意味します。 タイマークラスはグローバルなので、他の人がそれを使用しているかどうかを確認することはできません(たとえば、DBドライバがタイムアウトを実装するためにそれを使用している可能性があります)。

長時間の作業が必要な場合は、タイマーを使用して別のスレッドを「開始」します(作業キューに項目を追加するか、タイマーイベントハンドラーで2番目のスレッドを開始します)。 これはすぐに次のイベントのためにタイマーを解放します。


1


java.util.concurrent.ScheduledThreadPoolExecutor`は「新しい java.util.Timer`」です。 スレッド(プール)をいくつでも持つことができるので、長時間実行されるタスクにも対応できます。 それでも、重複しすぎていないことを確認することを検討してください。

そしてもちろん、あなたは複数の Timer`を持つことができ、あなたの TimerTask`を適切に配布することができます。


0


答えは、それは異なります。 この1つのポーリングタスクのみを実行する予定で、次のタスクが開始される前に各実行が終了するのに十分な間隔があれば、この解決策はうまく機能します。

問題は、同じTimerに複数のTimeTaskがある場合です。これらは同じスレッドで順次実行されるためです。 したがって、長時間実行されているタスクは他のタスクを長時間待機させることになり、これは時限タスクを作成する目的を無効にします。

java.util.concurrentパッケージおよびQuartzのような他のライブラリのより複雑なシナリオに対するより良い解決策があります。