4

これを使用してデータベースをポーリングする予定です。これには 10 ~ 15 分またはそれ以上かかることがあるため、タイマーを使用する必要があります。

4

7 に答える 7

8

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

于 2008-12-05T04:26:54.787 に答える
4

Swing 固有のものではなく、java.util.Timer について話していると思いますか?

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

そのため、アプリケーションの残りの部分と、他のタイマーを使用するかどうかに依存します。

一般的に、私はそれを深刻な目的で使用することは避けています。または、新しいスレッドを生成するだけです。

于 2008-12-05T04:20:38.073 に答える
3

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

于 2008-12-05T04:37:44.267 に答える
1

java.util.concurrent.ScheduledThreadPoolExecutor「新しいjava.util.Timer」です。スレッドの数 (プール) を持つことができるため、長時間実行されるタスクに対応できます。それでも、オーバーラップしすぎていないかどうかを確認することを検討することをお勧めします。

もちろん、複数Timerの を使用して、 を適切に分散させることもできTimerTaskます。

于 2008-12-05T13:07:09.913 に答える
1

このコンテキストでは、次のタイマー イベントが発生するまで作業を完了している必要があることを意味します。そうしないと、次のイベントが処理されません。タイマー クラスはグローバルであるため、他に誰がそれを使用しているかを確認することはできません (たとえば、DB ドライバーがそれを使用してタイムアウトを実装している可能性があります)。

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

于 2008-12-05T11:29:37.383 に答える
1

タイマー TASK は迅速に実行する必要があり、ポーリング間隔はその使用法とは関係ありません。2 つを混同しないようにしてください。

于 2008-12-05T04:24:48.783 に答える
0

答えは、状況によって異なります。この1つのポーリングタスクのみを実行する予定であり、次の実行が開始する前に各実行が終了するのに十分な間隔がある場合、このソリューションは正常に機能します。

問題は、同じタイマーに複数のTimeTaskがある場合です。これらは、同じスレッドで順番に実行されるためです。したがって、実行時間の長いタスクでは、他のタスクが長時間待機することになり、時間指定タスクを作成する目的が失われます。

java.util.concurrentパッケージや、Quartzなどの他のライブラリには、より複雑なシナリオに適したソリューションがあります。

于 2008-12-05T14:32:27.683 に答える