タスクを開始する必要があります。現在、多くのスレッドがこのタスクを開始できます。このタスクは通常、完了するまでに 4 ~ 5 秒かかります。このタスクが他のスレッドによって既に開始されている場合、タスクの開始を防止したいと考えています。この要件を実装するために、タスクがスレッドによって開始されるたびに、別のスレッドでタイマーまたはストップウォッチを開始することを考えています。構成された時間間隔の後にタイマーがタイムアウトすると、別のスレッドがタスクを開始できるようになりました。それで、別のスレッドでタイマーまたはストップウォッチを開始して、特定の時間に達したかどうかを確認することは良い解決策ですか?それに代わる良い方法はありますか?
3 に答える
私の理解が正しければ、これは悪い考えです。基本的に、ジョブが 5 秒以上実行されることはないと想定しているため、ウォッチがジョブの開始から 5 秒以内であると通知した場合、別のジョブを開始することはありません。これは非常に信頼できません。
代わりに、ジョブの開始時に設定し、終了時に設定を解除するフラグを作成します。AtomicBoolean
はそれに最適です:
private AtomicBoolean flag = new AtomicBoolean();
//...
if(!flag.getAndSet(true)) {
try {
//do your work
} finally {
flag.set(false);
}
} else {
//Already running
}
別のジョブを単に破棄するのではなく、前のジョブを待機させたい場合は、タスクを囲むsynchronized
か、別のロック メカニズムを使用します。
注: ジョブが分散されている場合は、データベースやhazelcastなどの分散ロック メカニズムが必要になります。
これをJavaで行おうとしている場合は、JAVAのオブジェクト指向アプローチで同期ブロックを使用することを検討できます。
したがって、確認したいタスクは、一度に1つのスレッドで実行してから、クラスとそのクラスの同期メソッドを作成します。また、すべてのスレッドがクラスの同じオブジェクトを共有していることを確認し、このメソッドを呼び出します。タスクを実行したい。
例えば
Class SyncTask{
synchronized void task1(){
//Perform your task here
}
}
アプリケーションの存続期間中にこのクラスのオブジェクトを1回作成してから、すべてのスレッドでこの同じオブジェクトを使用して、タスクを実行するこのメソッドを呼び出せるようにします。
このメソッドを同時に呼び出す複数のスレッドの場合。JVMがシーケンスを処理し、1つのスレッドがすでにタスクを実行している場合、それを呼び出す他のスレッドは最初のスレッドが終了するのを待ちます。
このようにして、常にスレッド上でのみタスクを実行していることを確認できます。
これがお役に立てば幸いです。