私の Java アプリケーションには、並列化できる 2 つのサーバー呼び出しを必要とするロード タスクがあります。そこで、スレッド t1 ( task1を実行) とスレッド t2 ( task2用) を起動します。次に、他の両方のタスク (1 と 2) が終了したときに、特定のタスクtask3を実行したいと考えています。当然、タスク 1とタスク 2のどちらが先に終了するかわかりません...
これをコーディングする最も簡単な(そして最も安全な)方法はどれですか?
ご協力ありがとうございました
私の Java アプリケーションには、並列化できる 2 つのサーバー呼び出しを必要とするロード タスクがあります。そこで、スレッド t1 ( task1を実行) とスレッド t2 ( task2用) を起動します。次に、他の両方のタスク (1 と 2) が終了したときに、特定のタスクtask3を実行したいと考えています。当然、タスク 1とタスク 2のどちらが先に終了するかわかりません...
これをコーディングする最も簡単な(そして最も安全な)方法はどれですか?
ご協力ありがとうございました
いくつかのオプションがあります:
および(いずれかの順序で)join
両方を実行してから、結合後に task3 を実行できます。t1
t2
task3 にリスナー インターフェイスを実装し、それを task1 と task2 の両方に登録します。Task1 と Task2 は、終了直前にリスナーを呼び出す必要があります。そうすることで、すでに終了したタスクを task3 に記録し、両方が終了したら、3 つ目のタスクを実行できます。
もちろん、タスク 1/2 のいずれかが例外で終了する可能性がある場合は、タスク 3 をその UncaughtExceptionHandler として配置することを忘れないでください。
2 つのワーカー スレッド (task1 と task2) がジョブを終了したときに終了させたくない場合は、他の 2 つが終了するまで task3 の条件で待機できます。このようなもの:
public class Master {
private Object monitor_ = new Object();
private boolean task1Finished_;
private boolean task2Finished_;
class Task1 extends Thread {
public void run() {
// do stuff
synchronized (monitor_) {
task1Finished_ = true;
monitor_.notifyAll();
}
// keep on working
}
}
class Task2 extends Thread {
public void run() {
// do stuff
synchronized (monitor_) {
task1Finished_ = true;
monitor_.notifyAll();
}
// keep on working
}
}
class Task3 extends Thread {
public void run() {
synchronized (monitor_) {
while (!task1Finished_ || !task2Finished_) {
try {
monitor_.wait();
}
catch (InterruptedException ignored) {
}
}
}
// do stuff
}
}
// start tasks1, task2 and task3...
}